/++
+ Generic programming v2.0 in the style DR
+/
auto ref findPos(T1, T2)(T1 required_element, T2 array) {
import std.variant;
foreach (i, e; array)
if (required_element == e) {
return Variant(i);
}
return Variant(-1);
}
T foo(T)(uint idx, uint takeLazyN, T arr) {
import std.range;
return arr[idx .. $].take(takeLazyN);
}
void main() {
import std.stdio, std.conv, std.range, std.algorithm, std.ascii, std.string, std.functional;
auto a = iota(0, 16).array;
auto s = lowercase.array;
assert(equal(a, [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]));
assert(equal(s, "abcdefghijklmnopqrstuvwxyz"));
auto tmpStart = findPos(3, a).toString;
alias checkFindFail = unaryFun!`a == "-1"`;
if (checkFindFail(tmpStart)) {
writeln("Fuck!");
return;
}
auto start = tmpStart.to!uint;
auto end = 10u;
writeln(foo(start, end, a));
tmpStart = findPos('d', s).toString;
if (checkFindFail(tmpStart)) {
writeln("Fuck!");
return;
}
start = tmpStart.to!uint;
writeln(foo(start, end, s));
}
LysrCiArIEdlbmVyaWMgcHJvZ3JhbW1pbmcgdjIuMCBpbiB0aGUgc3R5bGUgRFIKKy8KCmF1dG8gcmVmIGZpbmRQb3MoVDEsIFQyKShUMSByZXF1aXJlZF9lbGVtZW50LCBUMiBhcnJheSkgewoJaW1wb3J0IHN0ZC52YXJpYW50OwoKCWZvcmVhY2ggKGksIGU7IGFycmF5KQoJaWYgKHJlcXVpcmVkX2VsZW1lbnQgPT0gZSkgewoJCXJldHVybiBWYXJpYW50KGkpOwoJfQoKCXJldHVybiBWYXJpYW50KC0xKTsKfQoKVCBmb28oVCkodWludCBpZHgsIHVpbnQgdGFrZUxhenlOLCBUIGFycikgewoJaW1wb3J0IHN0ZC5yYW5nZTsKCglyZXR1cm4gYXJyW2lkeCAuLiAkXS50YWtlKHRha2VMYXp5Tik7Cn0KCnZvaWQgbWFpbigpIHsKCWltcG9ydCBzdGQuc3RkaW8sIHN0ZC5jb252LCBzdGQucmFuZ2UsIHN0ZC5hbGdvcml0aG0sIHN0ZC5hc2NpaSwgc3RkLnN0cmluZywgc3RkLmZ1bmN0aW9uYWw7CgoJYXV0byBhID0gaW90YSgwLCAxNikuYXJyYXk7CglhdXRvIHMgPSBsb3dlcmNhc2UuYXJyYXk7CgoJYXNzZXJ0KGVxdWFsKGEsIFsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSBdKSk7Cglhc3NlcnQoZXF1YWwocywgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwoKCWF1dG8gdG1wU3RhcnQgPSBmaW5kUG9zKDMsIGEpLnRvU3RyaW5nOwoKCWFsaWFzIGNoZWNrRmluZEZhaWwgPSB1bmFyeUZ1biFgYSA9PSAiLTEiYDsKCglpZiAoY2hlY2tGaW5kRmFpbCh0bXBTdGFydCkpIHsKCQl3cml0ZWxuKCJGdWNrISIpOwoJCXJldHVybjsKCX0KCglhdXRvIHN0YXJ0ID0gdG1wU3RhcnQudG8hdWludDsKCWF1dG8gZW5kID0gMTB1OwoKCXdyaXRlbG4oZm9vKHN0YXJ0LCBlbmQsIGEpKTsKCgl0bXBTdGFydCA9IGZpbmRQb3MoJ2QnLCBzKS50b1N0cmluZzsKCglpZiAoY2hlY2tGaW5kRmFpbCh0bXBTdGFydCkpIHsKCQl3cml0ZWxuKCJGdWNrISIpOwoJCXJldHVybjsKCX0KCglzdGFydCA9IHRtcFN0YXJ0LnRvIXVpbnQ7CgoJd3JpdGVsbihmb28oc3RhcnQsIGVuZCwgcykpOwp9