diff --git a/src/structure/collections/int-pair.ts b/src/structure/collections/int-pair.ts index a0c655d1193f358d263ae04e6786d803efc64434..2f661530762064ab7daef763095aae4cc7e82cab 100644 --- a/src/structure/collections/int-pair.ts +++ b/src/structure/collections/int-pair.ts @@ -4,6 +4,8 @@ * @author David Sehnal <david.sehnal@gmail.com> */ +import Iterator from './iterator' + interface IntPair { fst: number, snd: number } namespace IntPair { diff --git a/src/structure/collections/iterator.ts b/src/structure/collections/iterator.ts index 269f778ffffbe9ccf57c9e17d3b8a6a32f7ca203..c8e71eee291f2b3d32842557e59d98e09dba2779 100644 --- a/src/structure/collections/iterator.ts +++ b/src/structure/collections/iterator.ts @@ -75,10 +75,19 @@ class RangeIteratorImpl implements Iterator<number> { } } +class ValueIterator<T> implements Iterator<T> { + private yielded = false; + [Symbol.iterator]() { return new ValueIterator(this.value); }; + done = false; + next() { const value = this.move(); return { value, done: this.done } } + move() { this.done = this.yielded; this.yielded = true; return this.value; } + constructor(private value: T) { } +} + namespace Iterator { export const Empty: Iterator<any> = new RangeIteratorImpl(0, -1); export function Array<T>(xs: ArrayLike<T>): Iterator<T> { return new ArrayIteratorImpl<T>(xs); } - export function Value(value: number): Iterator<number> { return new RangeIteratorImpl(value, value); } + export function Value<T>(value: T): Iterator<T> { return new ValueIterator(value); } export function Range(min: number, max: number): Iterator<number> { return new RangeIteratorImpl(min, max); } } diff --git a/src/structure/collections/multi-set.ts b/src/structure/collections/multi-set.ts index f7cf53a154d1c6cd4c63a696fba53a2f55b69aa5..91ce6174ab6d6ccda22af9447d1fbdb72641fca6 100644 --- a/src/structure/collections/multi-set.ts +++ b/src/structure/collections/multi-set.ts @@ -52,15 +52,6 @@ namespace MultiSet { return ret; } - class PairIterator implements Iterator<IntPair> { - private yielded = false; - [Symbol.iterator]() { return new PairIterator(this.pair); }; - done = false; - next() { const value = this.move(); return { value, done: this.done } } - move() { this.done = this.yielded; this.yielded = true; return this.pair; } - constructor(private pair: IntPair) { } - } - class ElementsIterator implements Iterator<IntPair> { private pair = IntPair.zero(); private unit = 0; @@ -103,7 +94,7 @@ namespace MultiSet { } export function values(set: MultiSet): Iterator<IntPair> { - if (typeof set === 'number') return new PairIterator(IntPair.unpack1(set)); + if (typeof set === 'number') return Iterator.Value(IntPair.unpack1(set)); return new ElementsIterator(set); } @@ -125,7 +116,7 @@ namespace MultiSet { return create(ret); } - // TODO: union, intersection, subtraction + // TODO: size, ofObject, hashCode (and cache it), equal, union, intersection, subtraction export function union(sets: ArrayLike<MultiSet>): MultiSet { return 0 as any;