blob: 77678ebc0fc08e757f224734ba0f15eb054b6241 [file] [log] [blame]
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(18): Error: undefined identifier `ANYTHING`
fail_compilation/fail12378.d(18): Error: undefined identifier `GOES`
fail_compilation/fail12378.d(91): instantiated from here: `MapResultS!((x0) => ANYTHING - GOES, Result)`
fail_compilation/fail12378.d(17): instantiated from here: `mapS!(Result)`
fail_compilation/fail12378.d(100): instantiated from here: `__lambda1!int`
fail_compilation/fail12378.d(91): instantiated from here: `MapResultS!((y0) => iota(2).mapS!((x0) => ANYTHING - GOES), Result)`
fail_compilation/fail12378.d(16): instantiated from here: `mapS!(Result)`
---
*/
void testS()
{
auto r =
iota(1).mapS!(y0 =>
iota(2).mapS!(x0 =>
ANYTHING-GOES
)
);
}
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(40): Error: undefined identifier `ANYTHING`
fail_compilation/fail12378.d(40): Error: undefined identifier `GOES`
fail_compilation/fail12378.d(112): instantiated from here: `MapResultC!((x0) => ANYTHING - GOES, Result)`
fail_compilation/fail12378.d(39): instantiated from here: `mapC!(Result)`
fail_compilation/fail12378.d(123): instantiated from here: `__lambda1!int`
fail_compilation/fail12378.d(112): instantiated from here: `MapResultC!((y0) => iota(2).mapC!((x0) => ANYTHING - GOES), Result)`
fail_compilation/fail12378.d(38): instantiated from here: `mapC!(Result)`
---
*/
void testC()
{
auto r =
iota(1).mapC!(y0 =>
iota(2).mapC!(x0 =>
ANYTHING-GOES
)
);
}
/*
TEST_OUTPUT:
---
fail_compilation/fail12378.d(64): Error: undefined identifier `ANYTHING`
fail_compilation/fail12378.d(64): Error: undefined identifier `GOES`
fail_compilation/fail12378.d(135): instantiated from here: `MapResultI!((x0) => ANYTHING - GOES, Result)`
fail_compilation/fail12378.d(63): instantiated from here: `mapI!(Result)`
fail_compilation/fail12378.d(143): instantiated from here: `__lambda1!int`
fail_compilation/fail12378.d(135): instantiated from here: `MapResultI!((y0) => iota(2).mapI!((x0) => ANYTHING - GOES), Result)`
fail_compilation/fail12378.d(62): instantiated from here: `mapI!(Result)`
---
*/
void testI()
{
auto r =
iota(1).mapI!(y0 =>
iota(2).mapI!(x0 =>
ANYTHING-GOES
)
);
}
auto iota(E)(E end)
{
alias Value = E;
static struct Result
{
private Value current, pastLast;
@property inout(Value) front() inout { return current; }
}
return Result(0, end);
}
template mapS(fun...)
{
auto mapS(R)(R r)
{
alias AppliedReturnType(alias f) = typeof(f(r.front));
static assert(!is(AppliedReturnType!fun == void),
"Mapping function must not return void.");
return MapResultS!(fun, R)(r);
}
}
struct MapResultS(alias fun, R)
{
R _input;
@property auto ref front()
{
return fun(_input.front);
}
}
template mapC(fun...)
{
auto mapC(R)(R r)
{
alias AppliedReturnType(alias f) = typeof(f(r.front));
static assert(!is(AppliedReturnType!fun == void),
"Mapping function must not return void.");
return new MapResultC!(fun, R)(r);
}
}
class MapResultC(alias fun, R)
{
R _input;
this(R r) { _input = r; }
@property auto ref front()
{
return fun(_input.front);
}
}
template mapI(fun...)
{
auto mapI(R)(R r)
{
alias AppliedReturnType(alias f) = typeof(f(r.front));
static assert(!is(AppliedReturnType!fun == void),
"Mapping function must not return void.");
return MapResultI!(fun, R).init;
}
}
interface MapResultI(alias fun, R)
{
static @property auto ref front()
{
R _input;
return fun(_input.front);
}
}