diff --git a/src/Itertools.java b/src/Itertools.java index c7a624b..95b03cd 100644 --- a/src/Itertools.java +++ b/src/Itertools.java @@ -31,8 +31,14 @@ public static Iterable count(int start) { return count(start, 1); } - public static Iterable cycle(List list) { + public static Iterable cycle(Iterable iterable) { return () -> new Iterator() { + + Iterator iterator = iterable.iterator(); + + List list = new ArrayList<>(); + iterator.forEachRemaining(list::add); + int count = -1; @Override @@ -96,10 +102,16 @@ public T next() { * @param * @return */ - public static Iterable chain(List... iterables) { + public static Iterable chain(Iterable... iterables) { + + Iterator iterator = iterables.iterator(); + + List list1 = new ArrayList<>(); + iterator.forEachRemaining(list1::add); + int size = 0; for (List list : - iterables) { + list1) { size += list.size(); } int finalSize = size; @@ -117,12 +129,12 @@ public boolean hasNext() { @Override public T next() { int presentIterableIndex = counter - sizeTillNow; - while (presentIterableIndex >= iterables[iterableNo].size()) { - sizeTillNow += iterables[iterableNo].size(); + while (presentIterableIndex >= list1[iterableNo].size()) { + sizeTillNow += list1[iterableNo].size(); presentIterableIndex = counter - sizeTillNow; iterableNo++; } - return iterables[iterableNo].get(presentIterableIndex); + return list1[iterableNo].get(presentIterableIndex); } }; } @@ -133,21 +145,31 @@ public T next() { * @param * @return */ - public static Iterable compress(List data, List selectors) { + public static Iterable compress(Iterable data, Iterable selectors) { return () -> new Iterator() { + + Iterator iterator1 = data.iterator(); + Iterator iterator2 = selectors.iterator(); + + List data1 = new ArrayList<>(); + iterator1.forEachRemaining(data1::add); + + List selectors1 = new ArrayList<>(); + iterator2.forEachRemaining(selectors1::add); + int index = -1; @Override public boolean hasNext() { index++; - while (index < data.size() && !selectors.get(index)) + while (index < data1.size() && !selectors1.get(index)) index++; - return index < data.size(); + return index < data1.size(); } @Override public T next() { - return data.get(index); + return data1.get(index); } }; } @@ -158,24 +180,30 @@ public T next() { * @param * @return */ - public static Iterable dropWhile(Predicate pred, List seq) { + public static Iterable dropWhile(Predicate pred, Iterable seq) { return () -> new Iterator() { + + Iterator iterator = seq.iterator(); + + List list = new ArrayList<>(); + iterator.forEachRemaining(list::add); + boolean next = false; int index = -1; @Override public boolean hasNext() { index++; - while (!next && index < seq.size() && pred.pred(seq.get(index))) { + while (!next && index < list.size() && pred.pred(list.get(index))) { index++; } next = true; - return index < seq.size(); + return index < list.size(); } @Override public T next() { - return seq.get(index); + return list.get(index); } }; } @@ -186,67 +214,85 @@ public T next() { * @param * @return */ - public static Iterable ifilter(Predicate predicate, List list) { + public static Iterable ifilter(Predicate predicate, Iterable list) { return () -> new Iterator() { + + Iterator iterator = list.iterator(); + + List list1 = new ArrayList<>(); + iterator.forEachRemaining(list1::add); + int index = -1; @Override public boolean hasNext() { index++; - while (index < list.size() && !predicate.pred(list.get(index))) + while (index < list1.size() && !predicate.pred(list1.get(index))) index++; - return index < list.size(); + return index < list1.size(); } @Override public T next() { - return list.get(index); + return list1.get(index); } }; } - public static Iterable ifilterfalse(Predicate predicate, List list) { + public static Iterable ifilterfalse(Predicate predicate, Iterable list) { return () -> new Iterator() { + + Iterator iterator = list.iterator(); + + List list1 = new ArrayList<>(); + iterator.forEachRemaining(list1::add); + int index = -1; @Override public boolean hasNext() { index++; - while (index < list.size() && predicate.pred(list.get(index))) + while (index < list1.size() && predicate.pred(list1.get(index))) index++; - return index < list.size(); + return index < list1.size(); } @Override public T next() { - return list.get(index); + return list1.get(index); } }; } - public static Iterable islice(List seq, int start, int stop, int step) { + public static Iterable islice(Iterable seq, int start, int stop, int step) { return () -> new Iterator() { + + Iterator iterator = seq.iterator(); + + List list = new ArrayList<>(); + iterator.forEachRemaining(list::add); + int index = start - step; @Override public boolean hasNext() { index += step; - return index < seq.size() && index < stop && index >= start; + return index < list.size() && index < stop && index >= start; } @Override public T next() { - return seq.get(index); + return list.get(index); } }; } - public static Iterable islice(List seq, int stop, int step) { + public static Iterable islice(Iterable seq, int stop, int step) { return islice(seq, 0, stop, step); } - public static Iterable islice(List seq, int stop) { + public static Iterable islice(Iterable seq, int stop) { return islice(seq, 0, stop, 1); } @@ -272,24 +318,30 @@ public U next() { }; } - public static Iterable takeWhile(Predicate pred, List seq) { + public static Iterable takeWhile(Predicate pred, Iterable seq) { return () -> new Iterator() { + + Iterator iterator = seq.iterator(); + + List list = new ArrayList<>(); + iterator.forEachRemaining(list::add); + boolean next = false; int index = -1; @Override public boolean hasNext() { index++; - while (!next && index < seq.size() && !pred.pred(seq.get(index))) { + while (!next && index < seq.size() && !pred.pred(list.get(index))) { index++; } next = true; - return index < seq.size(); + return index < list.size(); } @Override public T next() { - return seq.get(index); + return list.get(index); } }; }