module pattern.selections; import pattern.base; import std.algorithm; import std.meta; import std.range; template selection(patterns...) if(__traits(compiles, staticMap!(asPattern, patterns))) { enum selection = function string(string input) { return staticMap!(asPattern, patterns).only .map!(pattern => pattern(input)) .filter!(result => result !is null) .chain(null.only) .takeOne .front; }; } version(unittest) { import pattern.brackets; import pattern.primitives; import pattern.repeats; } unittest { enum s = selection!( primitive!("a", "b", "c"), repeat!(bracket!('0', '9')) ); assert(s("a") == "a"); assert(s("0") == "0"); assert(s("F") is null); assert(s("010") == "010"); assert(s("abf") == "a"); assert(s("d14") is null); }