package org.jerlang.stdlib.lists;
import org.jerlang.erts.erlang.Error;
import org.jerlang.stdlib.Lists;
import org.jerlang.type.List;
import org.jerlang.type.Term;
public class ListsFlatten {
private ListsFlatten() {
}
public static Term dispatch(List params) {
switch (params.length()) {
case 1:
return flatten_1(params.head().toList());
case 2:
List deepList = params.head().toList();
params = params.tail();
List tail = params.head().toList();
return flatten_2(deepList, tail);
default:
throw Error.badarg;
}
}
/**
* Returns a flattened version of DeepList.
*
* http://www.erlang.org/doc/man/lists.html#flatten-1
*/
public static List flatten_1(List deepList) {
return do_flatten(deepList);
}
/**
* Returns a flattened version of DeepList with the tail Tail appended.
*
* http://www.erlang.org/doc/man/lists.html#flatten-2
*/
public static List flatten_2(List deepList, List tail) {
return new List(flatten_1(deepList), tail);
}
private static List do_flatten(Term term) {
if (term.isList()) {
List list = term.toList();
if (list.length() == 0) {
return List.nil;
} else {
Term head = list.head();
Term tail = list.tail();
return Lists.append(do_flatten(head), do_flatten(tail));
}
} else {
return new List(term);
}
}
}