On Tuesday, 20 February 2018 at 08:50:27 UTC, Jonathan M Davis
wrote:
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
Hi All,
Thank you very much, the provide solution work's for the given
example, so how can we achieve the same for the below code
import std.stdio;
import std.container;
import std.algorithm;
void main () {
auto a = Array!string("Test1", "Test2", "Test3", "Test1",
"Test2");
auto b = Array!string("Test1", "Test2", "Test3");
foreach(i; b[]) {
writeln(SList!int(a[].countUntil(i))[]); }
}
Output
[0]
[1]
[2]
Required
[0,3]
[1,4]
[2]
From,
Vino.B