1
1
package fj .function ;
2
2
3
- import fj .F ;
4
- import fj .F2 ;
5
- import fj .F3 ;
3
+
6
4
import static fj .Function .*;
7
5
6
+ import fj .F ;
8
7
import fj .Monoid ;
8
+ import fj .Semigroup ;
9
9
import fj .data .List ;
10
10
import fj .data .Stream ;
11
11
@@ -42,20 +42,12 @@ private Booleans() {
42
42
/**
43
43
* Logical negation.
44
44
*/
45
- public static final F <Boolean , Boolean > not = new F <Boolean , Boolean >() {
46
- public Boolean f (final Boolean p ) {
47
- return !p ;
48
- }
49
- };
45
+ public static final F <Boolean , Boolean > not = p -> !p ;
50
46
51
47
/**
52
48
* Curried form of logical "only if" (material implication).
53
49
*/
54
- public static final F <Boolean , F <Boolean , Boolean >> implies = curry (new F2 <Boolean , Boolean , Boolean >() {
55
- public Boolean f (final Boolean p , final Boolean q ) {
56
- return !p || q ;
57
- }
58
- });
50
+ public static final F <Boolean , F <Boolean , Boolean >> implies = curry ((p , q ) -> !p || q );
59
51
60
52
/**
61
53
* Curried form of logical "if" (reverse material implication).
@@ -92,6 +84,66 @@ public static boolean and(final List<Boolean> l) {
92
84
return Monoid .conjunctionMonoid .sumLeft (l );
93
85
}
94
86
87
+ /**
88
+ * maps given function to the predicate function
89
+ * @param p predicate to be mapped over
90
+ * @param f function
91
+ * @return predicate function
92
+ */
93
+ public static <A , B > F <B , Boolean > contramap (F <B , A > f , F <A , Boolean > p ){
94
+ return compose (p , f );
95
+ }
96
+
97
+ /**
98
+ * alias for contramap
99
+ * @param p predicate to be mapped over
100
+ * @param f function
101
+ * @return predicate function
102
+ */
103
+ public static <A , B > F <B , Boolean > is (F <B , A > f , F <A , Boolean > p ){
104
+ return contramap (f , p );
105
+ }
106
+
107
+ /**
108
+ * returns inverse of contramap
109
+ * @param p predicate to be mapped over
110
+ * @param f function
111
+ * @return predicate function
112
+ */
113
+ public static <A , B > F <B , Boolean > isnot (F <B , A > f , F <A , Boolean > p ){
114
+ return compose (not , contramap (f , p ));
115
+ }
116
+
117
+ /**
118
+ * composes the given predicate using conjunction
119
+ * @param p1 first predicate
120
+ * @param p2 second predicate
121
+ * @return composed predicate function
122
+ */
123
+ public static <A > F <A , Boolean > and (F <A , Boolean > p1 , F <A , Boolean > p2 ){
124
+ return Semigroup .<A , Boolean >functionSemigroup (conjunctionSemigroup ).sum (p1 , p2 );
125
+ }
126
+
127
+ /**
128
+ * composes the given predicate using exclusive disjunction
129
+ * @param p1 first predicate
130
+ * @param p2 second predicate
131
+ * @return composed predicate function
132
+ */
133
+ public static <A > F <A , Boolean > xor (F <A , Boolean > p1 , F <A , Boolean > p2 ){
134
+ return Semigroup .<A , Boolean >functionSemigroup (exclusiveDisjunctionSemiGroup ).sum (p1 , p2 );
135
+ }
136
+
137
+ /**
138
+ * returns composed predicate using disjunction
139
+ * @param p1 first predicate
140
+ * @param p2 second predicate
141
+ * @return composed predicate
142
+ */
143
+ public static <A > F <A , Boolean > or (F <A , Boolean > p1 , F <A , Boolean > p2 ){
144
+ return Semigroup .<A , Boolean >functionSemigroup (disjunctionSemigroup ).sum (p1 , p2 );
145
+ }
146
+
95
147
/**
96
148
* Returns true if all the elements of the given stream are true.
97
149
*
@@ -102,6 +154,46 @@ public static boolean and(final Stream<Boolean> l) {
102
154
return Monoid .conjunctionMonoid .sumLeft (l );
103
155
}
104
156
157
+ /**
158
+ * Returns composed predicate
159
+ *
160
+ * @param l A stream of predicates
161
+ * @return composed predicate
162
+ */
163
+ public static <A > F <A , Boolean > andAll (final Stream <F <A , Boolean >> l ) {
164
+ return Monoid .<A , Boolean >functionMonoid (Monoid .conjunctionMonoid ).sumLeft (l );
165
+ }
166
+
167
+ /**
168
+ * Returns a composed predicate of given List of predicates
169
+ *
170
+ * @param l A list of predicate functions
171
+ * @return composed predicate function
172
+ */
173
+ public static <A > F <A , Boolean > andAll (final List <F <A , Boolean >> l ) {
174
+ return Monoid .<A , Boolean >functionMonoid (Monoid .conjunctionMonoid ).sumLeft (l );
175
+ }
176
+
177
+ /**
178
+ * Returns a composed predicate of given List of predicates
179
+ *
180
+ * @param l A list of predicate functions
181
+ * @return composed predicate function
182
+ */
183
+ public static <A > F <A , Boolean > orAll (final List <F <A , Boolean >> l ) {
184
+ return Monoid .<A , Boolean >functionMonoid (Monoid .disjunctionMonoid ).sumLeft (l );
185
+ }
186
+
187
+ /**
188
+ * Returns a composed predicate of given Stream of predicates
189
+ *
190
+ * @param l A stream of predicate functions
191
+ * @return composed predicate function
192
+ */
193
+ public static <A > F <A , Boolean > orAll (final Stream <F <A , Boolean >> l ) {
194
+ return Monoid .<A , Boolean >functionMonoid (Monoid .disjunctionMonoid ).sumLeft (l );
195
+ }
196
+
105
197
/**
106
198
* Returns true if any element of the given list is true.
107
199
*
@@ -139,10 +231,6 @@ public static <A> F<A, Boolean> not(final F<A, Boolean> p) {
139
231
* @return A function that returns its second argument if the first argument is true, otherwise the third argument.
140
232
*/
141
233
public static <A > F <Boolean , F <A , F <A , A >>> cond () {
142
- return curry (new F3 <Boolean , A , A , A >() {
143
- public A f (final Boolean p , final A a1 , final A a2 ) {
144
- return p ? a1 : a2 ;
145
- }
146
- });
234
+ return curry ((p , a1 , a2 ) -> p ? a1 : a2 );
147
235
}
148
236
}
0 commit comments