1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
-- originally defined (as null) in evaluate.d
iterator = method(Dispatch => Thing)
next = method()
Iterator = new SelfInitializingType of FunctionClosure
Iterator.synonym = "iterator"
iterator Iterator := identity
next Iterator := iter -> iter()
net Iterator := iter -> (
x := if not (first frames iter)#?0 then () else first first frames iter;
net FunctionApplication(iterator,
(if instance(x, String) then format else identity) x))
iterator VisibleList :=
iterator String := x -> Iterator (
i := 0;
() -> (
if i >= #x then StopIteration
else (
r := x#i;
i = i + 1;
r)))
toList Thing := x -> for y in x list y
-- called by map(Expr,Expr) in actors3.d
applyIterator = (iter, f) -> Iterator (
() -> (
x := next iter;
if x === StopIteration then StopIteration
else f x))
select(Thing, Function) := Iterator => {} >> o -> (X, f) -> (
if lookup(iterator, class X) === null
then error "expected argument 1 to be an iterable object";
iter := iterator X;
Iterator (
() -> while true do (
x := next iter;
if x === StopIteration then return StopIteration;
y := f x;
if not instance(y, Boolean)
then error("select: expected predicate to yield true or false");
if y then return x)))
joinIterators = a -> (
n := #a;
iters := iterator \ a;
i := 0;
Iterator(
() -> (
if i >= n then StopIteration
else (
while (
r := next iters#i;
r === StopIteration)
do (
i = i + 1;
if i >= n then return StopIteration);
r))))
Iterator | Iterator := (x, y) -> joinIterators(x, y)
|