* @param <B>
	 * @param node
	 * @param nodeQuerier
	 * @param presentationQuerier
	 * @return
	 */
	public static <A, B> List<List<A>> flatten(B node,
			F1<B, List<B>> nodeQuerier,
			F1<B, A> presentationQuerier) {
		A a = presentationQuerier.e(node);
		List<B> bList = nodeQuerier.e(node);
		if (bList != null) {
			List<List<A>> flatten = flatten(bList, nodeQuerier,
					presentationQuerier);
			for (List<A> list : flatten) {
				list.add(0, a);
			}
			return flatten;
		} else {
			ArrayList<List<A>> list1 = new ArrayList<List<A>>();
			ArrayList<A> list2 = new ArrayList<A>();
			list2.add(a);
			list1.add(list2);
			return list1;
		}
	}