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