blob: 236c5134f5bb7ad9be13250e24b606f0fbb96093 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
namespace domain
{
using System;
using utility;
public static class Ranges
{
public static IRange<T> UpTo<T>(this T start, T end) where T: IComparable<T>, IIncrementable<T>
{
return new Range<T>(start, end);
}
}
public interface IRange<T> : IVisitable<T> where T : IComparable<T>
{
void Accept(Action<T> action);
bool Contains(T item);
}
public class Range<T> : IRange<T> where T : IComparable<T>, IIncrementable<T>
{
T start;
T end;
public Range(T start, T end)
{
this.start = start;
this.end = end;
}
public void Accept(IVisitor<T> visitor)
{
Accept(visitor.Visit);
}
public void Accept(Action<T> visitor)
{
var next = this.start;
var last = this.end.Next();
while(!next.Equals(last))
{
visitor(next);
next = next.Next();
}
}
public bool Contains(T item)
{
return start.CompareTo(item) <= 0 && end.CompareTo(item) > 0;
}
}
public interface IIncrementable<T>
{
T Next();
}
}
|