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 consisting of the intersection of two other character classes.
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