I think we can replace iterator chaining by objects that represent the transformations.
Then it can be applied lazily like Dask (aka build a compute graph) or applied like D-ranges, a bit like @timotheecour [PoC](https://github.com/timotheecour/vitanim/blob/82b73565bf24a984658974790c8ada32632f5a6a/drange/src/drange/drange_algorithms.nim). AFAIK the new C++20 ranges work like this as well.
