On Tuesday, February 20, 2018 08:44:37 aberba via Digitalmars-d-learn wrote: > On Sunday, 18 February 2018 at 15:23:14 UTC, Cym13 wrote: > > On Sunday, 18 February 2018 at 14:48:59 UTC, Cym13 wrote: > >> [...] > > > > Just thought of a much better/simpler solution for that last > > case that also doesn't force you to read all data (which might > > > > be impossible when dealing with infinite ranges): > > import std.range; > > import std.algorithm; > > > > a[] > > > > .enumerate // get tuples (index, > > > > value) > > > > .filter!(t => t[1] == "Test2") // keep only if value == > > > > "Test2" > > > > .map!(t => t[0]) // keep only the index > > > > part > > > > .writeln; > > > > Completely lazy. > > How does one detect an operation as lazy or not? Is the some > compile-time or runtime check for that? > > My guess is by referring to the docs function signature.
You have to read the docs or read the source code, though in general, functions that return a range type that wraps the original range tend to be lazy, whereas if a function returns the original range type or an array, then it's clearly not lazy. - Jonathan M Davis