View Javadoc

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    * Character class composed of the union of two other character classes.
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