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 ListsAppend { private ListsAppend() { } public static Term dispatch(List params) { switch (params.length()) { case 1: return append_1(params.head().toList()); case 2: List list1 = params.head().toList(); params = params.tail(); List list2 = params.head().toList(); return append_2(list1, list2); default: throw Error.badarg; } } /** * Returns a list in which all the sub-lists of ListOfLists have been appended. * * http://www.erlang.org/doc/man/lists.html#append-1 */ public static List append_1(List listOfLists) { List result = List.nil; while (listOfLists.length() > 0) { List subList = listOfLists.head().toList(); while (subList.length() > 0) { result = new List(subList.head(), result); subList = subList.tail(); } listOfLists = listOfLists.tail(); } return Lists.reverse(result); } /** * Returns a new list List3 which is made from the elements of List1 * followed by the elements of List2. * * http://www.erlang.org/doc/man/lists.html#append-2 */ public static List append_2(List list1, List list2) { List result = List.nil; while (list1.length() > 0) { result = new List(list1.head(), result); list1 = list1.tail(); } while (list2.length() > 0) { result = new List(list2.head(), result); list2 = list2.tail(); } return Lists.reverse(result); } }