using Mammoth.Couscous.java.lang; using Mammoth.Couscous.java.util; using Mammoth.Couscous.java.util.function; using System.Linq; namespace Mammoth.Couscous.org.zwobble.mammoth.@internal.util { internal static class Lists { internal static List list(params T[] values) { return ToJava.ListToList(values); } internal static List toList(Iterable iterable) { return ToJava.ListToList(FromJava.IterableToEnumerable(iterable).ToList()); } internal static List eagerFilter(Iterable iterable, Predicate function) { var result = FromJava.IterableToEnumerable(iterable) .Where(function.test) .ToList(); return ToJava.ListToList(result); } internal static List eagerMap(Iterable iterable, Function function) { var result = FromJava.IterableToEnumerable(iterable) .Select(function.apply) .ToList(); return ToJava.ListToList(result); } internal static List eagerMapWithIndex(Iterable iterable, BiFunction function) { var result = FromJava.IterableToEnumerable(iterable) .Select((value, index) => function.apply(index, value)) .ToList(); return ToJava.ListToList(result); } internal static List eagerFlatMap(Iterable iterable, Function> function) { var result = FromJava.IterableToEnumerable(iterable) .SelectMany(element => FromJava.IterableToEnumerable(function.apply(element))) .ToList(); return ToJava.ListToList(result); } internal static List cons(T head, Iterable tail) { var result = new T[] { head } .Concat(FromJava.IterableToEnumerable(tail)) .ToList(); return ToJava.ListToList(result); } internal static List eagerConcat(Iterable first, Iterable second) { var result = FromJava.IterableToEnumerable(first) .Concat(FromJava.IterableToEnumerable(second)) .ToList(); return ToJava.ListToList(result); } internal static List eagerConcat(Iterable first, Iterable second, Iterable third) { var result = FromJava.IterableToEnumerable(first) .Concat(FromJava.IterableToEnumerable(second)) .Concat(FromJava.IterableToEnumerable(third)) .ToList(); return ToJava.ListToList(result); } internal static List orderedBy(Iterable iterable, Function getKey) { var result = FromJava.IterableToEnumerable(iterable) .OrderBy(getKey.apply) .ToList(); return ToJava.ListToList(result); } internal static Optional tryGetFirst(List list) { if (list.isEmpty()) { return None.Instance; } else { return new Some(list.get(0)); } } internal static Optional tryGetLast(List list) { if (list.isEmpty()) { return None.Instance; } else { return new Some(list.get(list.size() - 1)); } } internal static Iterable reversed(List list) { return new ReversedList(list); } private class ReversedList : Iterable { private readonly List _list; internal ReversedList(List list) { _list = list; } public Iterator iterator() { return new ReverseIterator(_list); } } private class ReverseIterator : Iterator { private readonly List _list; private int _nextIndex; internal ReverseIterator(List list) { _list = list; _nextIndex = _list.size() - 1; } public bool hasNext() { return _nextIndex >= 0; } public T next() { if (hasNext()) { return _list.get(_nextIndex--); } else { throw new NoSuchElementException(); } } } } }