Hi! No stress is good news!
- what is the API in terms of vocabulary (ie drop the same as reject)
These are the operations implemented so far. |= means "satisfies", i.e., evaluate to true. Drop drop first n elements DropWhile drop first elements |= a block Filter* pick only elements |= a block Keep* only use elements ~= nil Map* map each element MapKeys* map each element an use as key Partition split after n elements PartitionBy split after elements |= a block RandomSample* pick elements with probability p Reductions intermediate results of reduce Remove* = Filter not Replace* replace elements by LUT Cat* concatenate sequences Dedupe remove consecutive duplicates Flatten* flatten nested sequence Take pick first n elements TakeNth pick every n-th element TakeWhile pick first elements |= a block Tee UNIX tee, concurrent evaluation Note, * means that the operation is parallelizable. As the operations are independent of the sequence class, the apply naturally to all kinds of sources, like collections, streams, channels and so on.
- can we reexpress some of our iterators?
Most of them. For example, generic for all collections: collect: aBlock ^self class <~ aBlock map <~ self reject: aBlock ^self class <~ ablock remove <~ self select: aBlock ^self class <~ aBlock filter <~ self As said before, names are not fixed yet and there is a more classical API on top available, too: collect: aBlock ^(self transduce map: aBlock) into: self class
- what is the cost?
Very little. In detail: 1) Upfront there is the constant cost of instantiating the tranducers. 2) The linear cost of evaluating a nested block for each element. This is likely to be optimized by the JIT, as the structure is very regular. I only did some micro-benchmarks which showed little to none impact on performance so far. Best, Steffen