@@ -4,12 +4,28 @@ import 'dart:core' as core;
44import 'iterator.dart' as js;
55
66
7+ /// Function that processes JS dynamic value into target class [T] .
8+ /// It is needed when JS value isn't exact type of [T] , e.g. JS lists are
9+ /// always dynamic.
10+ typedef IteratorValueCaster <T > = T ? Function (dynamic value);
11+
712/// Wrapper on top of [js.Iterator] , implementing [Iterable] and [Iterator] APIs.
813class IteratorWrapper <T > extends IterableBase <T > implements core.Iterator <T > {
9- IteratorWrapper (this ._iterator);
14+ IteratorWrapper (this ._iterator, [IteratorValueCaster <T >? valueCaster])
15+ : valueCaster = valueCaster ?? _valueCasterAs;
16+
17+ /// Default value caster via `as` .
18+ static T ? _valueCasterAs <T >(dynamic value) => value as T ? ;
1019
20+ /// Target [js.Iterator] .
1121 final js.Iterator <T > _iterator;
1222
23+ /// Function that processes JS dynamic value into target class [T] .
24+ /// It is needed when JS value isn't exact type of [T] , e.g. JS lists are
25+ /// always dynamic.
26+ final IteratorValueCaster <T > valueCaster;
27+
28+ /// Current value buffer.
1329 T ? _current;
1430
1531 @override
@@ -18,7 +34,7 @@ class IteratorWrapper<T> extends IterableBase<T> implements core.Iterator<T> {
1834 @override
1935 bool moveNext () {
2036 final next = _iterator.next ();
21- _current = next.value;
37+ _current = valueCaster ( next.value) ;
2238 return ! (next.done ?? false );
2339 }
2440
0 commit comments