4
* License: Public Domain
7
static class NumberSet(int skip, bool reverse=false, int add=0){
8
static int[] opSlice(int i,int j){
10
int[] rv = new int[j-i];
13
for(int n;i<j;i+=skip,n++){
14
rv[n]=reverse?-i-add:i+add;
18
static int opIndex(int i){
24
alias NumberSet!(1) IntegerSet;
26
alias NumberSet!(1, true) ReverseIntegerSet;
28
alias NumberSet!(2) EvenNumberSet;
30
alias NumberSet!(2, true) ReverseEvenNumberSet;
32
alias NumberSet!(2, false, 1) OddNumberSet;
34
alias NumberSet!(2, true, 1) ReverseOddNumberSet;
36
///$start-$end $start$start-$end$end...
37
static class StringSet(char start,char end){
38
static string[] opSlice(uint i,uint j){
40
string[] rv = new string[j-i];
41
string a = opIndex(i);
42
foreach(inout string v; rv){
44
a = next!(start, end)(a);
48
static string opIndex(uint i){
49
const int n = end-start+1;
59
private static string next(char start,char end)(string val){
61
for(int i=val.length-1;i>=0;i--){
68
rv.length = rv.length+1;
69
rv[1..$] = rv[0..$-1];
75
///a-z aa-zz aaa-zzz...
76
alias StringSet!('a','z') AlphabetSet;
80
assert(IntegerSet[0..6] == [0,1,2,3,4,5]);
81
assert(ReverseIntegerSet[0..6] == [0,-1,-2,-3,-4,-5]);
82
assert(IntegerSet[0..1] == [0]);
83
assert(ReverseIntegerSet[0..1] == [0]);
84
assert(IntegerSet[-5..6] == [-5,-4,-3,-2,-1,0,1,2,3,4,5]);
85
assert(ReverseIntegerSet[-5..6] == [5,4,3,2,1,0,-1,-2,-3,-4,-5]);
86
assert(IntegerSet[-5..1] == [-5,-4,-3,-2,-1,0]);
87
assert(ReverseIntegerSet[-5..1] == [5,4,3,2,1,0]);
88
assert(IntegerSet[0]==0);
89
assert(IntegerSet[5]==5);
90
assert(IntegerSet[-5]==-5);
91
assert(EvenNumberSet[1..3]==[2,4]);
92
assert(OddNumberSet[1..3]==[3,5]);
93
assert(AlphabetSet[0..1]==["a"[]]);
94
assert(AlphabetSet[1..2]==["b"[]]);
95
assert(AlphabetSet[99]==AlphabetSet[0..100][$-1]);