From 217629e5d2a10f5ba150845cd40a16aa65b1a9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Karnok?= Date: Mon, 2 Jan 2017 18:08:28 +0100 Subject: [PATCH 1/2] First step to switch the internal protocol --- gradle.properties | 2 +- src/jmh/java/ix/IxCharactersPerf.java | 69 ++++++++++++++++++++++ src/main/java/ix/Ix.java | 14 +++++ src/main/java/ix/IxCharacters.java | 36 ++++++++++- src/main/java/ix/IxEnumerator.java | 51 ++++++++++++++++ src/main/java/ix/IxEnumeratorIterator.java | 67 +++++++++++++++++++++ 6 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 src/jmh/java/ix/IxCharactersPerf.java create mode 100644 src/main/java/ix/IxEnumerator.java create mode 100644 src/main/java/ix/IxEnumeratorIterator.java diff --git a/gradle.properties b/gradle.properties index d4591bd..f0ad651 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.0-RC5 +version=1.0.0-RC6 diff --git a/src/jmh/java/ix/IxCharactersPerf.java b/src/jmh/java/ix/IxCharactersPerf.java new file mode 100644 index 0000000..5e9c1d0 --- /dev/null +++ b/src/jmh/java/ix/IxCharactersPerf.java @@ -0,0 +1,69 @@ +/* + * Copyright 2011-2016 David Karnok + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ix; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +/** + * Example benchmark. Run from command line as + *
+ * gradle jmh -Pjmh='IxPerf' + */ +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 5) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@OutputTimeUnit(TimeUnit.SECONDS) +@Fork(value = 1) +@State(Scope.Thread) +public class IxCharactersPerf { + + @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) + public int count; + + Ix ix; + + @Setup + public void setup(Blackhole bh) { + char[] chars = new char[count]; + Arrays.fill(chars, 'a'); + + ix = Ix.characters(new String(chars)); + } + + @Benchmark + public void charsIterator(Blackhole bh) { + Iterator it = ix.iterator(); + + while (it.hasNext()) { + bh.consume(it.next()); + } + } + + + @Benchmark + public void charsEnumerator(Blackhole bh) { + IxEnumerator it = ix.enumerator(); + + while (it.moveNext()) { + bh.consume(it.current()); + } + } +} diff --git a/src/main/java/ix/Ix.java b/src/main/java/ix/Ix.java index 2911710..6dbb128 100644 --- a/src/main/java/ix/Ix.java +++ b/src/main/java/ix/Ix.java @@ -31,6 +31,20 @@ */ public abstract class Ix implements Iterable { + /** + * Returns an IxEnumerator for this Ix instance. + * @return the IxEnumerator instance + */ + public /* abstract */ IxEnumerator enumerator() { + // TODO + throw new UnsupportedOperationException(); + } + + @Override + public Iterator iterator() { + return new IxEnumeratorIterator(enumerator()); + } + /** * Emits all characters from the given CharSequence as integer values. *

diff --git a/src/main/java/ix/IxCharacters.java b/src/main/java/ix/IxCharacters.java index c54a404..475ddd0 100644 --- a/src/main/java/ix/IxCharacters.java +++ b/src/main/java/ix/IxCharacters.java @@ -37,6 +37,11 @@ public Iterator iterator() { return new CharactersIterator(source, start, end); } + @Override + public IxEnumerator enumerator() { + return new CharactersEnumerator(source, start, end); + } + static final class CharactersIterator implements Iterator { final CharSequence source; @@ -65,11 +70,40 @@ public Integer next() { } throw new NoSuchElementException(); } - + @Override public void remove() { throw new UnsupportedOperationException(); } } + static final class CharactersEnumerator implements IxEnumerator { + + final CharSequence chars; + + final int end; + + int index; + + CharactersEnumerator(CharSequence chars, int start, int end) { + this.chars = chars; + this.index = start - 1; + this.end = end; + } + + @Override + public boolean moveNext() { + return ++index < end; + } + + @Override + public Integer current() { + return (int)chars.charAt(index); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } } diff --git a/src/main/java/ix/IxEnumerator.java b/src/main/java/ix/IxEnumerator.java new file mode 100644 index 0000000..57dabcf --- /dev/null +++ b/src/main/java/ix/IxEnumerator.java @@ -0,0 +1,51 @@ +/* + * Copyright 2011-2016 David Karnok + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ix; + +/** + * Represents a moveNext/current style streaming API. + *

The problem with Iterator is that often next() has + * to call hasNext or otherwise check if the stream has + * properly moved along. + * @param the value type + */ +public interface IxEnumerator { + + /** + * Move the stream to the next element and return true, + * or return false if the stream has ended + * @return true if there is an item available via {@link #current()} + * false otherwise + */ + boolean moveNext(); + + /** + * Retrieves the current item after a successful {@link #moveNext()} + *

Calling this method before calling moveNext() first or after + * moveNext() returned false is undefined behavior (it may return + * null or crash). + * @return the current item + */ + T current(); + + /** + * Remove the current item. + * @throws UnsupportedOperationException if the upstream is read-only + * or otherwise doesn't support removal + */ + void remove(); +} diff --git a/src/main/java/ix/IxEnumeratorIterator.java b/src/main/java/ix/IxEnumeratorIterator.java new file mode 100644 index 0000000..b6440bc --- /dev/null +++ b/src/main/java/ix/IxEnumeratorIterator.java @@ -0,0 +1,67 @@ +/* + * Copyright 2011-2016 David Karnok + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ix; + +import java.util.*; + +/** + * Turns an IxEnumerator into a java.util.Iterator. + * @param the value type + */ +final class IxEnumeratorIterator implements Iterator { + + final IxEnumerator source; + + boolean hasValue; + + boolean done; + + IxEnumeratorIterator(IxEnumerator source) { + this.source = source; + } + + @Override + public boolean hasNext() { + if (!hasValue) { + if (done) { + return false; + } + + if (source.moveNext()) { + hasValue = true; + return true; + } + done = true; + return false; + } + return true; + } + + @Override + public T next() { + if (hasNext()) { + hasValue = false; + return source.current(); + } + throw new NoSuchElementException(); + } + + @Override + public void remove() { + source.remove(); + } +} From e66db4bb9a8f7cf57331a4c4738b784c888a1597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Karnok?= Date: Mon, 2 Jan 2017 19:22:21 +0100 Subject: [PATCH 2/2] Adjust some base types --- gradle.properties | 2 +- src/main/java/ix/Ix.java | 8 +-- src/main/java/ix/IxAggregate.java | 2 +- src/main/java/ix/IxAll.java | 2 +- src/main/java/ix/IxAny.java | 2 +- src/main/java/ix/IxAverageDouble.java | 2 +- src/main/java/ix/IxAverageFloat.java | 2 +- src/main/java/ix/IxBuffer.java | 2 +- src/main/java/ix/IxBufferOverlap.java | 2 +- src/main/java/ix/IxBufferSkip.java | 2 +- src/main/java/ix/IxBufferSplit.java | 2 +- src/main/java/ix/IxBufferUntil.java | 2 +- src/main/java/ix/IxBufferWhile.java | 2 +- src/main/java/ix/IxCollect.java | 54 +++++++++++++++++++- src/main/java/ix/IxCompose.java | 2 +- src/main/java/ix/IxContains.java | 2 +- src/main/java/ix/IxCount.java | 2 +- src/main/java/ix/IxCountLong.java | 2 +- src/main/java/ix/IxDistinct.java | 2 +- src/main/java/ix/IxDistinctUntilChanged.java | 2 +- src/main/java/ix/IxDoOn.java | 2 +- src/main/java/ix/IxEmpty.java | 12 ++++- src/main/java/ix/IxEvery.java | 2 +- src/main/java/ix/IxExcept.java | 2 +- src/main/java/ix/IxFilter.java | 2 +- src/main/java/ix/IxFlattenIterable.java | 2 +- src/main/java/ix/IxGroupBy.java | 2 +- src/main/java/ix/IxHasElements.java | 2 +- src/main/java/ix/IxIgnoreElements.java | 2 +- src/main/java/ix/IxIntersect.java | 2 +- src/main/java/ix/IxJoin.java | 2 +- src/main/java/ix/IxLift.java | 2 +- src/main/java/ix/IxMap.java | 2 +- src/main/java/ix/IxMaxInt.java | 2 +- src/main/java/ix/IxMaxLong.java | 2 +- src/main/java/ix/IxMinInt.java | 2 +- src/main/java/ix/IxMinLong.java | 2 +- src/main/java/ix/IxMinMax.java | 2 +- src/main/java/ix/IxOrderBy.java | 2 +- src/main/java/ix/IxPublish.java | 2 +- src/main/java/ix/IxPublishSelector.java | 2 +- src/main/java/ix/IxReadOnly.java | 2 +- src/main/java/ix/IxReduce.java | 2 +- src/main/java/ix/IxRemove.java | 2 +- src/main/java/ix/IxReplay.java | 2 +- src/main/java/ix/IxReplaySelector.java | 2 +- src/main/java/ix/IxReplaySize.java | 2 +- src/main/java/ix/IxReplaySizeSelector.java | 2 +- src/main/java/ix/IxRetain.java | 2 +- src/main/java/ix/IxReverse.java | 2 +- src/main/java/ix/IxScan.java | 2 +- src/main/java/ix/IxScanSeed.java | 2 +- src/main/java/ix/IxSequenceEqual.java | 2 +- src/main/java/ix/IxSkip.java | 2 +- src/main/java/ix/IxSkipLast.java | 2 +- src/main/java/ix/IxSkipWhile.java | 2 +- src/main/java/ix/IxSource.java | 4 +- src/main/java/ix/IxSumInt.java | 2 +- src/main/java/ix/IxSumLong.java | 2 +- src/main/java/ix/IxSwitchIfEmpty.java | 2 +- src/main/java/ix/IxTake.java | 2 +- src/main/java/ix/IxTakeLast.java | 2 +- src/main/java/ix/IxTakeUntil.java | 2 +- src/main/java/ix/IxTakeWhile.java | 2 +- src/main/java/ix/IxToMap.java | 2 +- src/main/java/ix/IxToMultimap.java | 2 +- src/main/java/ix/IxToSet.java | 2 +- src/main/java/ix/IxTransformer.java | 2 +- src/main/java/ix/IxUnion.java | 2 +- src/main/java/ix/IxWindow.java | 2 +- src/main/java/ix/IxWindowOverlap.java | 2 +- src/main/java/ix/IxWindowSkip.java | 2 +- src/main/java/ix/IxWrapper.java | 41 ++++++++++++++- 73 files changed, 177 insertions(+), 78 deletions(-) diff --git a/gradle.properties b/gradle.properties index f0ad651..9dcf894 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.0-RC6 +version=1.0.0-RC5a diff --git a/src/main/java/ix/Ix.java b/src/main/java/ix/Ix.java index 6dbb128..50752bb 100644 --- a/src/main/java/ix/Ix.java +++ b/src/main/java/ix/Ix.java @@ -39,7 +39,7 @@ public abstract class Ix implements Iterable { // TODO throw new UnsupportedOperationException(); } - + @Override public Iterator iterator() { return new IxEnumeratorIterator(enumerator()); @@ -94,7 +94,7 @@ public static Ix characters(CharSequence cs, int start, int end) { @SuppressWarnings({ "unchecked", "rawtypes" }) public static Ix concat(Iterable> sources) { return new IxFlattenIterable, T>( - (Iterable)nullCheck(sources, "sources is null"), + nullCheck(from((Iterable)sources), "sources is null"), IdentityHelper.>instance()); } @@ -787,7 +787,7 @@ public final R as(IxFunction, R> transformer) { */ @SuppressWarnings("unchecked") public final Ix averageFloat() { - return new IxAverageFloat((Iterable)this); + return new IxAverageFloat((Ix)this); } /** @@ -803,7 +803,7 @@ public final Ix averageFloat() { */ @SuppressWarnings("unchecked") public final Ix averageDouble() { - return new IxAverageDouble((Iterable)this); + return new IxAverageDouble((Ix)this); } /** diff --git a/src/main/java/ix/IxAggregate.java b/src/main/java/ix/IxAggregate.java index 2a4b255..4fb04cd 100644 --- a/src/main/java/ix/IxAggregate.java +++ b/src/main/java/ix/IxAggregate.java @@ -22,7 +22,7 @@ final class IxAggregate extends IxSource { final IxFunction2 aggregator; - IxAggregate(Iterable source, IxFunction2 aggregator) { + IxAggregate(Ix source, IxFunction2 aggregator) { super(source); this.aggregator = aggregator; } diff --git a/src/main/java/ix/IxAll.java b/src/main/java/ix/IxAll.java index ceb6fd4..fe022a0 100644 --- a/src/main/java/ix/IxAll.java +++ b/src/main/java/ix/IxAll.java @@ -22,7 +22,7 @@ final class IxAll extends IxSource { final IxPredicate predicate; - IxAll(Iterable source, IxPredicate predicate) { + IxAll(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxAny.java b/src/main/java/ix/IxAny.java index 9589936..e8e13cb 100644 --- a/src/main/java/ix/IxAny.java +++ b/src/main/java/ix/IxAny.java @@ -22,7 +22,7 @@ final class IxAny extends IxSource { final IxPredicate predicate; - IxAny(Iterable source, IxPredicate predicate) { + IxAny(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxAverageDouble.java b/src/main/java/ix/IxAverageDouble.java index b51b692..d289c4e 100644 --- a/src/main/java/ix/IxAverageDouble.java +++ b/src/main/java/ix/IxAverageDouble.java @@ -20,7 +20,7 @@ final class IxAverageDouble extends IxSource { - IxAverageDouble(Iterable source) { + IxAverageDouble(Ix source) { super(source); } diff --git a/src/main/java/ix/IxAverageFloat.java b/src/main/java/ix/IxAverageFloat.java index 8cf3664..e005f01 100644 --- a/src/main/java/ix/IxAverageFloat.java +++ b/src/main/java/ix/IxAverageFloat.java @@ -20,7 +20,7 @@ final class IxAverageFloat extends IxSource { - IxAverageFloat(Iterable source) { + IxAverageFloat(Ix source) { super(source); } diff --git a/src/main/java/ix/IxBuffer.java b/src/main/java/ix/IxBuffer.java index 1a03c38..69f200f 100644 --- a/src/main/java/ix/IxBuffer.java +++ b/src/main/java/ix/IxBuffer.java @@ -22,7 +22,7 @@ final class IxBuffer extends IxSource> { final int size; - IxBuffer(Iterable source, int size) { + IxBuffer(Ix source, int size) { super(source); this.size = size; } diff --git a/src/main/java/ix/IxBufferOverlap.java b/src/main/java/ix/IxBufferOverlap.java index c801ddf..725c4e6 100644 --- a/src/main/java/ix/IxBufferOverlap.java +++ b/src/main/java/ix/IxBufferOverlap.java @@ -24,7 +24,7 @@ final class IxBufferOverlap extends IxSource> { final int skip; - IxBufferOverlap(Iterable source, int size, int skip) { + IxBufferOverlap(Ix source, int size, int skip) { super(source); this.size = size; this.skip = skip; diff --git a/src/main/java/ix/IxBufferSkip.java b/src/main/java/ix/IxBufferSkip.java index 70ca253..c3e7360 100644 --- a/src/main/java/ix/IxBufferSkip.java +++ b/src/main/java/ix/IxBufferSkip.java @@ -24,7 +24,7 @@ final class IxBufferSkip extends IxSource> { final int skip; - IxBufferSkip(Iterable source, int size, int skip) { + IxBufferSkip(Ix source, int size, int skip) { super(source); this.size = size; this.skip = skip; diff --git a/src/main/java/ix/IxBufferSplit.java b/src/main/java/ix/IxBufferSplit.java index e354496..8661585 100644 --- a/src/main/java/ix/IxBufferSplit.java +++ b/src/main/java/ix/IxBufferSplit.java @@ -28,7 +28,7 @@ final class IxBufferSplit extends IxSource> { final IxPredicate predicate; - IxBufferSplit(Iterable source, IxPredicate predicate) { + IxBufferSplit(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxBufferUntil.java b/src/main/java/ix/IxBufferUntil.java index 6a1e72c..11c4511 100644 --- a/src/main/java/ix/IxBufferUntil.java +++ b/src/main/java/ix/IxBufferUntil.java @@ -28,7 +28,7 @@ final class IxBufferUntil extends IxSource> { final IxPredicate predicate; - IxBufferUntil(Iterable source, IxPredicate predicate) { + IxBufferUntil(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxBufferWhile.java b/src/main/java/ix/IxBufferWhile.java index af28b81..eee1d2a 100644 --- a/src/main/java/ix/IxBufferWhile.java +++ b/src/main/java/ix/IxBufferWhile.java @@ -27,7 +27,7 @@ final class IxBufferWhile extends IxSource> { final IxPredicate predicate; - IxBufferWhile(Iterable source, IxPredicate predicate) { + IxBufferWhile(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxCollect.java b/src/main/java/ix/IxCollect.java index 4932bc2..e468a87 100644 --- a/src/main/java/ix/IxCollect.java +++ b/src/main/java/ix/IxCollect.java @@ -24,7 +24,7 @@ final class IxCollect extends IxSource { final IxConsumer2 collector; - IxCollect(Iterable source, IxSupplier initialFactory, IxConsumer2 collector) { + IxCollect(Ix source, IxSupplier initialFactory, IxConsumer2 collector) { super(source); this.initialFactory = initialFactory; this.collector = collector; @@ -35,6 +35,11 @@ public Iterator iterator() { return new CollectorIterator(source.iterator(), collector, initialFactory.get()); } + @Override + public IxEnumerator enumerator() { + return new CollectorEnumerator(source.enumerator(), collector, initialFactory.get()); + } + static final class CollectorIterator extends IxSourceIterator { final IxConsumer2 collector; @@ -62,4 +67,51 @@ protected boolean moveNext() { return true; } } + + static final class CollectorEnumerator implements IxEnumerator { + + final IxEnumerator source; + + final IxConsumer2 collector; + + C value; + + boolean once; + + CollectorEnumerator(IxEnumerator source, IxConsumer2 collector, C value) { + this.source = source; + this.collector = collector; + this.value = value; + } + + @Override + public boolean moveNext() { + if (!once) { + once = true; + + C c = value; + + IxEnumerator src = source; + IxConsumer2 coll = collector; + + while (src.moveNext()) { + coll.accept(c, src.current()); + } + + return true; + } + value = null; + return false; + } + + @Override + public C current() { + return value; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } } diff --git a/src/main/java/ix/IxCompose.java b/src/main/java/ix/IxCompose.java index c578bf8..fa82cb4 100644 --- a/src/main/java/ix/IxCompose.java +++ b/src/main/java/ix/IxCompose.java @@ -22,7 +22,7 @@ final class IxCompose extends IxSource { final IxFunction, ? extends Iterable> transformer; - IxCompose(Iterable source, IxFunction, ? extends Iterable> transformer) { + IxCompose(Ix source, IxFunction, ? extends Iterable> transformer) { super(source); this.transformer = transformer; } diff --git a/src/main/java/ix/IxContains.java b/src/main/java/ix/IxContains.java index 5e44c24..a78e02c 100644 --- a/src/main/java/ix/IxContains.java +++ b/src/main/java/ix/IxContains.java @@ -22,7 +22,7 @@ final class IxContains extends IxSource { final Object o; - IxContains(Iterable source, Object o) { + IxContains(Ix source, Object o) { super(source); this.o = o; } diff --git a/src/main/java/ix/IxCount.java b/src/main/java/ix/IxCount.java index 882f662..04f57cb 100644 --- a/src/main/java/ix/IxCount.java +++ b/src/main/java/ix/IxCount.java @@ -20,7 +20,7 @@ final class IxCount extends IxSource { - IxCount(Iterable source) { + IxCount(Ix source) { super(source); } diff --git a/src/main/java/ix/IxCountLong.java b/src/main/java/ix/IxCountLong.java index f06a40f..1b35fa6 100644 --- a/src/main/java/ix/IxCountLong.java +++ b/src/main/java/ix/IxCountLong.java @@ -20,7 +20,7 @@ final class IxCountLong extends IxSource { - IxCountLong(Iterable source) { + IxCountLong(Ix source) { super(source); } diff --git a/src/main/java/ix/IxDistinct.java b/src/main/java/ix/IxDistinct.java index 94ac42d..265bac3 100644 --- a/src/main/java/ix/IxDistinct.java +++ b/src/main/java/ix/IxDistinct.java @@ -22,7 +22,7 @@ final class IxDistinct extends IxSource { final IxFunction keySelector; - IxDistinct(Iterable source, IxFunction keySelector) { + IxDistinct(Ix source, IxFunction keySelector) { super(source); this.keySelector = keySelector; } diff --git a/src/main/java/ix/IxDistinctUntilChanged.java b/src/main/java/ix/IxDistinctUntilChanged.java index 9f7b44a..9e69f7e 100644 --- a/src/main/java/ix/IxDistinctUntilChanged.java +++ b/src/main/java/ix/IxDistinctUntilChanged.java @@ -24,7 +24,7 @@ final class IxDistinctUntilChanged extends IxSource { final IxPredicate2 comparer; - IxDistinctUntilChanged(Iterable source, IxFunction keySelector, + IxDistinctUntilChanged(Ix source, IxFunction keySelector, IxPredicate2 comparer) { super(source); this.keySelector = keySelector; diff --git a/src/main/java/ix/IxDoOn.java b/src/main/java/ix/IxDoOn.java index 57feef6..f625dd5 100644 --- a/src/main/java/ix/IxDoOn.java +++ b/src/main/java/ix/IxDoOn.java @@ -24,7 +24,7 @@ final class IxDoOn extends IxSource { final Runnable onCompleted; - IxDoOn(Iterable source, IxConsumer onNext, Runnable onCompleted) { + IxDoOn(Ix source, IxConsumer onNext, Runnable onCompleted) { super(source); this.onNext = onNext; this.onCompleted = onCompleted; diff --git a/src/main/java/ix/IxEmpty.java b/src/main/java/ix/IxEmpty.java index 7e76d4d..c3a61ad 100644 --- a/src/main/java/ix/IxEmpty.java +++ b/src/main/java/ix/IxEmpty.java @@ -18,7 +18,7 @@ import java.util.*; -final class IxEmpty extends Ix implements Iterator { +final class IxEmpty extends Ix implements Iterator, IxEnumerator { static final IxEmpty INSTANCE = new IxEmpty(); @@ -46,4 +46,14 @@ public Object next() { public void remove() { throw new UnsupportedOperationException(); } + + @Override + public Object current() { + return null; + } + + @Override + public boolean moveNext() { + return false; + } } diff --git a/src/main/java/ix/IxEvery.java b/src/main/java/ix/IxEvery.java index 7c510a2..33ae564 100644 --- a/src/main/java/ix/IxEvery.java +++ b/src/main/java/ix/IxEvery.java @@ -27,7 +27,7 @@ final class IxEvery extends IxSource { final int nth; - IxEvery(Iterable source, int nth) { + IxEvery(Ix source, int nth) { super(source); this.nth = nth; } diff --git a/src/main/java/ix/IxExcept.java b/src/main/java/ix/IxExcept.java index af4bdb5..387e98f 100644 --- a/src/main/java/ix/IxExcept.java +++ b/src/main/java/ix/IxExcept.java @@ -23,7 +23,7 @@ final class IxExcept extends IxSource { final Iterable other; - IxExcept(Iterable source, Iterable other) { + IxExcept(Ix source, Iterable other) { super(source); this.other = other; } diff --git a/src/main/java/ix/IxFilter.java b/src/main/java/ix/IxFilter.java index c26a036..56840a3 100644 --- a/src/main/java/ix/IxFilter.java +++ b/src/main/java/ix/IxFilter.java @@ -22,7 +22,7 @@ final class IxFilter extends IxSource { final IxPredicate predicate; - IxFilter(Iterable source, IxPredicate predicate) { + IxFilter(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxFlattenIterable.java b/src/main/java/ix/IxFlattenIterable.java index d1969c1..73321b4 100644 --- a/src/main/java/ix/IxFlattenIterable.java +++ b/src/main/java/ix/IxFlattenIterable.java @@ -23,7 +23,7 @@ final class IxFlattenIterable extends IxSource { final IxFunction> mapper; - IxFlattenIterable(Iterable source, IxFunction> mapper) { + IxFlattenIterable(Ix source, IxFunction> mapper) { super(source); this.mapper = mapper; } diff --git a/src/main/java/ix/IxGroupBy.java b/src/main/java/ix/IxGroupBy.java index e23d9f3..46bb5de 100644 --- a/src/main/java/ix/IxGroupBy.java +++ b/src/main/java/ix/IxGroupBy.java @@ -26,7 +26,7 @@ final class IxGroupBy extends IxSource> { final IxFunction valueSelector; - IxGroupBy(Iterable source, IxFunction keySelector, + IxGroupBy(Ix source, IxFunction keySelector, IxFunction valueSelector) { super(source); this.keySelector = keySelector; diff --git a/src/main/java/ix/IxHasElements.java b/src/main/java/ix/IxHasElements.java index 1d2d9b9..61da31c 100644 --- a/src/main/java/ix/IxHasElements.java +++ b/src/main/java/ix/IxHasElements.java @@ -20,7 +20,7 @@ final class IxHasElements extends IxSource { - IxHasElements(Iterable source) { + IxHasElements(Ix source) { super(source); } diff --git a/src/main/java/ix/IxIgnoreElements.java b/src/main/java/ix/IxIgnoreElements.java index f7240f5..7c543a4 100644 --- a/src/main/java/ix/IxIgnoreElements.java +++ b/src/main/java/ix/IxIgnoreElements.java @@ -20,7 +20,7 @@ final class IxIgnoreElements extends IxSource { - IxIgnoreElements(Iterable source) { + IxIgnoreElements(Ix source) { super(source); } diff --git a/src/main/java/ix/IxIntersect.java b/src/main/java/ix/IxIntersect.java index 40a1332..5620639 100644 --- a/src/main/java/ix/IxIntersect.java +++ b/src/main/java/ix/IxIntersect.java @@ -22,7 +22,7 @@ final class IxIntersect extends IxSource { final Iterable other; - IxIntersect(Iterable source, Iterable other) { + IxIntersect(Ix source, Iterable other) { super(source); this.other = other; } diff --git a/src/main/java/ix/IxJoin.java b/src/main/java/ix/IxJoin.java index 85566bd..4e58c25 100644 --- a/src/main/java/ix/IxJoin.java +++ b/src/main/java/ix/IxJoin.java @@ -22,7 +22,7 @@ final class IxJoin extends IxSource { final CharSequence separator; - IxJoin(Iterable source, CharSequence separator) { + IxJoin(Ix source, CharSequence separator) { super(source); this.separator = separator; } diff --git a/src/main/java/ix/IxLift.java b/src/main/java/ix/IxLift.java index 0c4ec67..e03bbfc 100644 --- a/src/main/java/ix/IxLift.java +++ b/src/main/java/ix/IxLift.java @@ -22,7 +22,7 @@ final class IxLift extends IxSource { final IxFunction, ? extends Iterator> lifter; - IxLift(Iterable source, IxFunction, ? extends Iterator> lifter) { + IxLift(Ix source, IxFunction, ? extends Iterator> lifter) { super(source); this.lifter = lifter; } diff --git a/src/main/java/ix/IxMap.java b/src/main/java/ix/IxMap.java index 684de67..fff679b 100644 --- a/src/main/java/ix/IxMap.java +++ b/src/main/java/ix/IxMap.java @@ -22,7 +22,7 @@ final class IxMap extends IxSource { final IxFunction mapper; - IxMap(Iterable source, IxFunction mapper) { + IxMap(Ix source, IxFunction mapper) { super(source); this.mapper = mapper; } diff --git a/src/main/java/ix/IxMaxInt.java b/src/main/java/ix/IxMaxInt.java index 394a340..67df169 100644 --- a/src/main/java/ix/IxMaxInt.java +++ b/src/main/java/ix/IxMaxInt.java @@ -20,7 +20,7 @@ final class IxMaxInt extends IxSource { - IxMaxInt(Iterable source) { + IxMaxInt(Ix source) { super(source); } diff --git a/src/main/java/ix/IxMaxLong.java b/src/main/java/ix/IxMaxLong.java index 652255d..fba61bd 100644 --- a/src/main/java/ix/IxMaxLong.java +++ b/src/main/java/ix/IxMaxLong.java @@ -20,7 +20,7 @@ final class IxMaxLong extends IxSource { - IxMaxLong(Iterable source) { + IxMaxLong(Ix source) { super(source); } diff --git a/src/main/java/ix/IxMinInt.java b/src/main/java/ix/IxMinInt.java index 0f5f627..cc7c8f5 100644 --- a/src/main/java/ix/IxMinInt.java +++ b/src/main/java/ix/IxMinInt.java @@ -20,7 +20,7 @@ final class IxMinInt extends IxSource { - IxMinInt(Iterable source) { + IxMinInt(Ix source) { super(source); } diff --git a/src/main/java/ix/IxMinLong.java b/src/main/java/ix/IxMinLong.java index 7a04e9f..2df486f 100644 --- a/src/main/java/ix/IxMinLong.java +++ b/src/main/java/ix/IxMinLong.java @@ -20,7 +20,7 @@ final class IxMinLong extends IxSource { - IxMinLong(Iterable source) { + IxMinLong(Ix source) { super(source); } diff --git a/src/main/java/ix/IxMinMax.java b/src/main/java/ix/IxMinMax.java index d2e2e24..466c784 100644 --- a/src/main/java/ix/IxMinMax.java +++ b/src/main/java/ix/IxMinMax.java @@ -24,7 +24,7 @@ final class IxMinMax extends IxSource { final int flag; - IxMinMax(Iterable source, Comparator comparator, int flag) { + IxMinMax(Ix source, Comparator comparator, int flag) { super(source); this.comparator = comparator; this.flag = flag; diff --git a/src/main/java/ix/IxOrderBy.java b/src/main/java/ix/IxOrderBy.java index b77e66a..4ac904c 100644 --- a/src/main/java/ix/IxOrderBy.java +++ b/src/main/java/ix/IxOrderBy.java @@ -26,7 +26,7 @@ final class IxOrderBy extends IxSource { final int flag; - IxOrderBy(Iterable source, IxFunction keySelector, Comparator comparator, int flag) { + IxOrderBy(Ix source, IxFunction keySelector, Comparator comparator, int flag) { super(source); this.keySelector = keySelector; this.comparator = comparator; diff --git a/src/main/java/ix/IxPublish.java b/src/main/java/ix/IxPublish.java index 4570ce0..3488447 100644 --- a/src/main/java/ix/IxPublish.java +++ b/src/main/java/ix/IxPublish.java @@ -22,7 +22,7 @@ final class IxPublish extends IxSource { Iterator current; - IxPublish(Iterable source) { + IxPublish(Ix source) { super(source); } diff --git a/src/main/java/ix/IxPublishSelector.java b/src/main/java/ix/IxPublishSelector.java index f03130e..51e41cd 100644 --- a/src/main/java/ix/IxPublishSelector.java +++ b/src/main/java/ix/IxPublishSelector.java @@ -22,7 +22,7 @@ final class IxPublishSelector extends IxSource { final IxFunction, ? extends Iterable> selector; - IxPublishSelector(Iterable source, IxFunction, ? extends Iterable> selector) { + IxPublishSelector(Ix source, IxFunction, ? extends Iterable> selector) { super(source); this.selector = selector; } diff --git a/src/main/java/ix/IxReadOnly.java b/src/main/java/ix/IxReadOnly.java index 6850d90..181ce77 100644 --- a/src/main/java/ix/IxReadOnly.java +++ b/src/main/java/ix/IxReadOnly.java @@ -27,7 +27,7 @@ final class IxReadOnly extends IxSource { final boolean silent; - IxReadOnly(Iterable source, boolean silent) { + IxReadOnly(Ix source, boolean silent) { super(source); this.silent = silent; } diff --git a/src/main/java/ix/IxReduce.java b/src/main/java/ix/IxReduce.java index aa58af7..0baf37d 100644 --- a/src/main/java/ix/IxReduce.java +++ b/src/main/java/ix/IxReduce.java @@ -24,7 +24,7 @@ final class IxReduce extends IxSource { final IxFunction2 reducer; - IxReduce(Iterable source, IxSupplier initialFactory, IxFunction2 reducer) { + IxReduce(Ix source, IxSupplier initialFactory, IxFunction2 reducer) { super(source); this.initialFactory = initialFactory; this.reducer = reducer; diff --git a/src/main/java/ix/IxRemove.java b/src/main/java/ix/IxRemove.java index fe99cd8..119b0c2 100644 --- a/src/main/java/ix/IxRemove.java +++ b/src/main/java/ix/IxRemove.java @@ -22,7 +22,7 @@ final class IxRemove extends IxSource { final IxPredicate predicate; - IxRemove(Iterable source, IxPredicate predicate) { + IxRemove(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxReplay.java b/src/main/java/ix/IxReplay.java index 9f588ba..8055587 100644 --- a/src/main/java/ix/IxReplay.java +++ b/src/main/java/ix/IxReplay.java @@ -24,7 +24,7 @@ final class IxReplay extends IxSource { Iterator it; - IxReplay(Iterable source) { + IxReplay(Ix source) { super(source); } diff --git a/src/main/java/ix/IxReplaySelector.java b/src/main/java/ix/IxReplaySelector.java index 943a835..5c7d377 100644 --- a/src/main/java/ix/IxReplaySelector.java +++ b/src/main/java/ix/IxReplaySelector.java @@ -22,7 +22,7 @@ final class IxReplaySelector extends IxSource { final IxFunction, ? extends Iterable> selector; - IxReplaySelector(Iterable source, IxFunction, ? extends Iterable> selector) { + IxReplaySelector(Ix source, IxFunction, ? extends Iterable> selector) { super(source); this.selector = selector; } diff --git a/src/main/java/ix/IxReplaySize.java b/src/main/java/ix/IxReplaySize.java index edfc5e5..e486530 100644 --- a/src/main/java/ix/IxReplaySize.java +++ b/src/main/java/ix/IxReplaySize.java @@ -30,7 +30,7 @@ final class IxReplaySize extends IxSource { int size; - IxReplaySize(Iterable source, int maxSize) { + IxReplaySize(Ix source, int maxSize) { super(source); this.maxSize = maxSize; this.head = this.tail = new Node(null); diff --git a/src/main/java/ix/IxReplaySizeSelector.java b/src/main/java/ix/IxReplaySizeSelector.java index fa52393..a85e3d4 100644 --- a/src/main/java/ix/IxReplaySizeSelector.java +++ b/src/main/java/ix/IxReplaySizeSelector.java @@ -24,7 +24,7 @@ final class IxReplaySizeSelector extends IxSource { final IxFunction, ? extends Iterable> selector; - IxReplaySizeSelector(Iterable source, int maxSize, + IxReplaySizeSelector(Ix source, int maxSize, IxFunction, ? extends Iterable> selector) { super(source); this.maxSize = maxSize; diff --git a/src/main/java/ix/IxRetain.java b/src/main/java/ix/IxRetain.java index d467853..4c66027 100644 --- a/src/main/java/ix/IxRetain.java +++ b/src/main/java/ix/IxRetain.java @@ -22,7 +22,7 @@ final class IxRetain extends IxSource { final IxPredicate predicate; - IxRetain(Iterable source, IxPredicate predicate) { + IxRetain(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxReverse.java b/src/main/java/ix/IxReverse.java index 6faf720..fdc6aba 100644 --- a/src/main/java/ix/IxReverse.java +++ b/src/main/java/ix/IxReverse.java @@ -20,7 +20,7 @@ final class IxReverse extends IxSource { - IxReverse(Iterable source) { + IxReverse(Ix source) { super(source); } diff --git a/src/main/java/ix/IxScan.java b/src/main/java/ix/IxScan.java index e618c34..9ad7669 100644 --- a/src/main/java/ix/IxScan.java +++ b/src/main/java/ix/IxScan.java @@ -22,7 +22,7 @@ final class IxScan extends IxSource { final IxFunction2 scanner; - IxScan(Iterable source, IxFunction2 scanner) { + IxScan(Ix source, IxFunction2 scanner) { super(source); this.scanner = scanner; } diff --git a/src/main/java/ix/IxScanSeed.java b/src/main/java/ix/IxScanSeed.java index d02bbf3..a061545 100644 --- a/src/main/java/ix/IxScanSeed.java +++ b/src/main/java/ix/IxScanSeed.java @@ -24,7 +24,7 @@ final class IxScanSeed extends IxSource { final IxFunction2 scanner; - IxScanSeed(Iterable source, IxSupplier seed, IxFunction2 scanner) { + IxScanSeed(Ix source, IxSupplier seed, IxFunction2 scanner) { super(source); this.seed = seed; this.scanner = scanner; diff --git a/src/main/java/ix/IxSequenceEqual.java b/src/main/java/ix/IxSequenceEqual.java index b26f1e5..7a7d046 100644 --- a/src/main/java/ix/IxSequenceEqual.java +++ b/src/main/java/ix/IxSequenceEqual.java @@ -24,7 +24,7 @@ final class IxSequenceEqual extends IxSource { final IxPredicate2 comparer; - IxSequenceEqual(Iterable source, Iterable other, + IxSequenceEqual(Ix source, Iterable other, IxPredicate2 comparer) { super(source); this.other = other; diff --git a/src/main/java/ix/IxSkip.java b/src/main/java/ix/IxSkip.java index ef56e1f..fd713ad 100644 --- a/src/main/java/ix/IxSkip.java +++ b/src/main/java/ix/IxSkip.java @@ -22,7 +22,7 @@ final class IxSkip extends IxSource { final int n; - IxSkip(Iterable source, int n) { + IxSkip(Ix source, int n) { super(source); this.n = n; } diff --git a/src/main/java/ix/IxSkipLast.java b/src/main/java/ix/IxSkipLast.java index 09e4aa2..b131f80 100644 --- a/src/main/java/ix/IxSkipLast.java +++ b/src/main/java/ix/IxSkipLast.java @@ -22,7 +22,7 @@ final class IxSkipLast extends IxSource { final int n; - IxSkipLast(Iterable source, int n) { + IxSkipLast(Ix source, int n) { super(source); this.n = n; } diff --git a/src/main/java/ix/IxSkipWhile.java b/src/main/java/ix/IxSkipWhile.java index 158ea62..f2f2c31 100644 --- a/src/main/java/ix/IxSkipWhile.java +++ b/src/main/java/ix/IxSkipWhile.java @@ -22,7 +22,7 @@ final class IxSkipWhile extends IxSource { final IxPredicate predicate; - IxSkipWhile(Iterable source, IxPredicate predicate) { + IxSkipWhile(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxSource.java b/src/main/java/ix/IxSource.java index f3a0364..0e83a97 100644 --- a/src/main/java/ix/IxSource.java +++ b/src/main/java/ix/IxSource.java @@ -23,9 +23,9 @@ */ abstract class IxSource extends Ix { - protected final Iterable source; + protected final Ix source; - IxSource(Iterable source) { + IxSource(Ix source) { this.source = source; } diff --git a/src/main/java/ix/IxSumInt.java b/src/main/java/ix/IxSumInt.java index bb312d6..7b8272e 100644 --- a/src/main/java/ix/IxSumInt.java +++ b/src/main/java/ix/IxSumInt.java @@ -20,7 +20,7 @@ final class IxSumInt extends IxSource { - IxSumInt(Iterable source) { + IxSumInt(Ix source) { super(source); } diff --git a/src/main/java/ix/IxSumLong.java b/src/main/java/ix/IxSumLong.java index 6e9f7ab..2fff3ec 100644 --- a/src/main/java/ix/IxSumLong.java +++ b/src/main/java/ix/IxSumLong.java @@ -20,7 +20,7 @@ final class IxSumLong extends IxSource { - IxSumLong(Iterable source) { + IxSumLong(Ix source) { super(source); } diff --git a/src/main/java/ix/IxSwitchIfEmpty.java b/src/main/java/ix/IxSwitchIfEmpty.java index aa4d6dd..e980220 100644 --- a/src/main/java/ix/IxSwitchIfEmpty.java +++ b/src/main/java/ix/IxSwitchIfEmpty.java @@ -22,7 +22,7 @@ final class IxSwitchIfEmpty extends IxSource { final Iterable other; - IxSwitchIfEmpty(Iterable source, Iterable other) { + IxSwitchIfEmpty(Ix source, Iterable other) { super(source); this.other = other; } diff --git a/src/main/java/ix/IxTake.java b/src/main/java/ix/IxTake.java index 698171c..5d39229 100644 --- a/src/main/java/ix/IxTake.java +++ b/src/main/java/ix/IxTake.java @@ -22,7 +22,7 @@ final class IxTake extends IxSource { final int n; - IxTake(Iterable source, int n) { + IxTake(Ix source, int n) { super(source); this.n = n; } diff --git a/src/main/java/ix/IxTakeLast.java b/src/main/java/ix/IxTakeLast.java index 278a354..9a1badb 100644 --- a/src/main/java/ix/IxTakeLast.java +++ b/src/main/java/ix/IxTakeLast.java @@ -22,7 +22,7 @@ final class IxTakeLast extends IxSource { final int n; - IxTakeLast(Iterable source, int n) { + IxTakeLast(Ix source, int n) { super(source); this.n = n; } diff --git a/src/main/java/ix/IxTakeUntil.java b/src/main/java/ix/IxTakeUntil.java index ff89ad4..7b885b3 100644 --- a/src/main/java/ix/IxTakeUntil.java +++ b/src/main/java/ix/IxTakeUntil.java @@ -22,7 +22,7 @@ final class IxTakeUntil extends IxSource { final IxPredicate predicate; - IxTakeUntil(Iterable source, IxPredicate predicate) { + IxTakeUntil(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxTakeWhile.java b/src/main/java/ix/IxTakeWhile.java index 5da9258..4474dae 100644 --- a/src/main/java/ix/IxTakeWhile.java +++ b/src/main/java/ix/IxTakeWhile.java @@ -22,7 +22,7 @@ final class IxTakeWhile extends IxSource { final IxPredicate predicate; - IxTakeWhile(Iterable source, IxPredicate predicate) { + IxTakeWhile(Ix source, IxPredicate predicate) { super(source); this.predicate = predicate; } diff --git a/src/main/java/ix/IxToMap.java b/src/main/java/ix/IxToMap.java index f9c3527..2f3703e 100644 --- a/src/main/java/ix/IxToMap.java +++ b/src/main/java/ix/IxToMap.java @@ -24,7 +24,7 @@ final class IxToMap extends IxSource> { final IxFunction valueSelector; - IxToMap(Iterable source, IxFunction keySelector, IxFunction valueSelector) { + IxToMap(Ix source, IxFunction keySelector, IxFunction valueSelector) { super(source); this.keySelector = keySelector; this.valueSelector = valueSelector; diff --git a/src/main/java/ix/IxToMultimap.java b/src/main/java/ix/IxToMultimap.java index a01c5db..52385a4 100644 --- a/src/main/java/ix/IxToMultimap.java +++ b/src/main/java/ix/IxToMultimap.java @@ -24,7 +24,7 @@ final class IxToMultimap extends IxSource>> { final IxFunction valueSelector; - IxToMultimap(Iterable source, IxFunction keySelector, IxFunction valueSelector) { + IxToMultimap(Ix source, IxFunction keySelector, IxFunction valueSelector) { super(source); this.keySelector = keySelector; this.valueSelector = valueSelector; diff --git a/src/main/java/ix/IxToSet.java b/src/main/java/ix/IxToSet.java index b3e6983..ee18e13 100644 --- a/src/main/java/ix/IxToSet.java +++ b/src/main/java/ix/IxToSet.java @@ -20,7 +20,7 @@ final class IxToSet extends IxSource> { - IxToSet(Iterable source) { + IxToSet(Ix source) { super(source); } diff --git a/src/main/java/ix/IxTransformer.java b/src/main/java/ix/IxTransformer.java index aeebe1f..62f0610 100644 --- a/src/main/java/ix/IxTransformer.java +++ b/src/main/java/ix/IxTransformer.java @@ -22,7 +22,7 @@ final class IxTransformer extends IxSource { final IxTransform transform; - IxTransformer(Iterable source, IxTransform transform) { + IxTransformer(Ix source, IxTransform transform) { super(source); this.transform = transform; } diff --git a/src/main/java/ix/IxUnion.java b/src/main/java/ix/IxUnion.java index 2961f9d..8808fb2 100644 --- a/src/main/java/ix/IxUnion.java +++ b/src/main/java/ix/IxUnion.java @@ -22,7 +22,7 @@ final class IxUnion extends IxSource { final Iterable other; - IxUnion(Iterable source, Iterable other) { + IxUnion(Ix source, Iterable other) { super(source); this.other = other; } diff --git a/src/main/java/ix/IxWindow.java b/src/main/java/ix/IxWindow.java index c0632dc..b409383 100644 --- a/src/main/java/ix/IxWindow.java +++ b/src/main/java/ix/IxWindow.java @@ -24,7 +24,7 @@ final class IxWindow extends IxSource> { static final Object NULL = new Object(); - IxWindow(Iterable source, int size) { + IxWindow(Ix source, int size) { super(source); this.size = size; } diff --git a/src/main/java/ix/IxWindowOverlap.java b/src/main/java/ix/IxWindowOverlap.java index 21ae806..999eec0 100644 --- a/src/main/java/ix/IxWindowOverlap.java +++ b/src/main/java/ix/IxWindowOverlap.java @@ -26,7 +26,7 @@ final class IxWindowOverlap extends IxSource> { static final Object NULL = new Object(); - IxWindowOverlap(Iterable source, int size, int skip) { + IxWindowOverlap(Ix source, int size, int skip) { super(source); this.size = size; this.skip = skip; diff --git a/src/main/java/ix/IxWindowSkip.java b/src/main/java/ix/IxWindowSkip.java index 6e7f8d7..e8bc570 100644 --- a/src/main/java/ix/IxWindowSkip.java +++ b/src/main/java/ix/IxWindowSkip.java @@ -26,7 +26,7 @@ final class IxWindowSkip extends IxSource> { static final Object NULL = new Object(); - IxWindowSkip(Iterable source, int size, int skip) { + IxWindowSkip(Ix source, int size, int skip) { super(source); this.size = size; this.skip = skip; diff --git a/src/main/java/ix/IxWrapper.java b/src/main/java/ix/IxWrapper.java index 53ab5b2..ac11901 100644 --- a/src/main/java/ix/IxWrapper.java +++ b/src/main/java/ix/IxWrapper.java @@ -18,15 +18,52 @@ import java.util.Iterator; -final class IxWrapper extends IxSource { +final class IxWrapper extends Ix { + final Iterable source; + IxWrapper(Iterable source) { - super(source); + this.source = source; } @Override public Iterator iterator() { return source.iterator(); } + + @Override + public IxEnumerator enumerator() { + return new WrapperEnumerator(source.iterator()); + } + + static final class WrapperEnumerator implements IxEnumerator { + + final Iterator source; + + T value; + WrapperEnumerator(Iterator source) { + this.source = source; + } + + @Override + public boolean moveNext() { + Iterator src = source; + if (src.hasNext()) { + value = src.next(); + return true; + } + return false; + } + + @Override + public T current() { + return value; + } + + @Override + public void remove() { + source.remove(); + } + } }