- `[captures] { body }` for blocks.
- `[captures] ( expr )` for expressions.
- `Optional.with` for running a block of code with the value in an Optional, if one is present.
+- `iter.flatten`
Removals:
- Remove old syntax for quoted blocks, `#quote` and `#()`.
skip :: skip;
skip_while :: skip_while;
+ flatten :: flatten;
enumerate :: enumerate;
fold :: fold;
}
+#doc """
+ Filters and maps at the same time.
+
+ If the provided function returns a None variant of Optional,
+ then the entry is discarded.
+
+ If the provided function returns `Some(x)`, then `x` is yielded.
+"""
+flatten :: (i: Iterator($T), f: (T) -> ? $R) -> Iterator(R) {
+ return generator(
+ &.{ i = i, f = f },
+
+ fi => {
+ while true {
+ v, cont := next(fi.i);
+ if !cont do break;
+
+ v2 := fi.f(v);
+ if v2 {
+ return v2->unwrap(), true;
+ }
+ }
+ return .{}, false;
+ },
+
+ fi => { close(fi.i); }
+ );
+}
+
#doc """
Combines iterators by first yielding all values from