1 package io.github.reggert.reb4j.charclass;
2
3 import fj.F2;
4 import fj.data.LazyString;
5 import fj.data.List;
6
7
8
9
10 public final class Intersection extends CharClass
11 {
12 private static final long serialVersionUID = 1L;
13
14 public final List<CharClass> supersets;
15
16 private Intersection(final List<CharClass> supersets)
17 {
18 if (supersets == null) throw new NullPointerException("supersets");
19 this.supersets = supersets;
20 }
21
22 @Override
23 public Negated<Intersection> negated()
24 {
25 return new Negated<Intersection>(this);
26 }
27
28 @Override
29 public LazyString unitableForm()
30 {
31 return supersets.tail().foldLeft(
32 new F2<LazyString, CharClass, LazyString>()
33 {
34 @Override
35 public LazyString f(final LazyString a, final CharClass b)
36 {return a.append("&&").append(b.independentForm());}
37 },
38 supersets.head().independentForm()
39 );
40 }
41
42 @Override
43 public LazyString independentForm()
44 {
45 return LazyString.str("[").append(unitableForm()).append("]");
46 }
47
48 @Override
49 public Intersection intersect(final CharClass right)
50 {
51 return new Intersection(supersets.append(List.single(right)));
52 }
53
54 @Override
55 public Intersection intersect(final Intersection right)
56 {
57 return new Intersection(supersets.append(right.supersets));
58 }
59
60 static Intersection intersect(final CharClass left, final CharClass right)
61 {
62 return new Intersection(List.list(left, right));
63 }
64
65 static Intersection intersect(final CharClass left, final Intersection right)
66 {
67 return new Intersection(right.supersets.cons(left));
68 }
69
70 @Override
71 public int hashCode()
72 {
73 final int prime = 31;
74 int result = 1;
75 result = prime * result + supersets.hashCode();
76 return result;
77 }
78
79 @Override
80 public boolean equals(final Object obj)
81 {
82 if (this == obj)
83 return true;
84 if (obj == null)
85 return false;
86 if (getClass() != obj.getClass())
87 return false;
88 final Intersection other = (Intersection) obj;
89 return supersets.equals(other.supersets);
90 }
91 }
92