Returns the element type of a struct with .DeepElement inner alias or a type of common array. Returns ForeachType if struct does not have .DeepElement member.
This is a best-effort implementation of length for any kind of range. If hasLength!Range, simply returns range.length without checking upTo (when specified). Otherwise, walks the range through its length and returns the number of elements seen. Performes O(n) evaluations of range.empty and range.popFront(), where n is the effective length of range.
Returns the element type of a struct with .DeepElement inner alias or a type of common array. Returns ForeachType if struct does not have .DeepElement member.
The element type of R. R does not have to be a range. The element type is determined as the type yielded by r.front for an object r of type R. For example, ElementType!(T[]) is T if T[] isn't a narrow string; if it is, the element type is dchar. If R doesn't have front, ElementType!R is void.
Returns true if R is an infinite input range. An infinite input range is an input range that has a statically-defined enumerated member called empty that is always false, for example:
Returns true if R is an input range. An input range must define the primitives empty, popFront, and front. The following code should compile for any input range.
Returns true if R is an output range for elements of type E. An output range is defined functionally as a range that supports the operation r.put(e).
Templates used to check primitives and range primitives for arrays with multi-dimensional like API support.
Note: UTF strings behaves like common arrays in Mir. std.uni.byCodePoint can be used to create a range of characters.