summaryrefslogtreecommitdiff
path: root/src/domain/Range.cs
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();
  }
}