Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///
- struct EachWithEachOtherRange(R) {
- private R inputRange;
- this(R r) {
- inputRange = r;
- }
- private size_t y = 0;
- private size_t x = 1;
- auto front() {
- assert(!empty);
- return [inputRange[x], inputRange[y]];
- }
- void popFront() {
- x++;
- if(x >= inputRange.length) {
- y++;
- x = y+1;
- }
- }
- bool empty() const {
- return x >= inputRange.length;
- }
- size_t length() const {
- const len = inputRange.length;
- return (len * len - len) / 2;
- }
- }
- ///
- auto eachWithOther(T)(T inputRange) {
- return EachWithEachOtherRange!(T)(inputRange);
- }
- unittest {
- import std.algorithm.iteration: map;
- import std.algorithm.searching: count;
- int[] arr = [0, 1, 2, 3];
- assert(arr.eachWithOther.map!(a => a).count == 6);
- assert(arr.eachWithOther.length == 6);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement