001 package edu.rice.cs.cunit.util; 002 003 /** 004 * Unary predicate interface Boolean <- P 005 * @author Mathias Ricken 006 */ 007 public interface IPredicate<P> extends ILambda<Boolean, P> { 008 /** 009 * Unary NOT. 010 */ 011 public static class Not implements IPredicate<Boolean> { 012 private Not() { } 013 public static final Not ONLY = new Not(); 014 public Boolean apply(Boolean param) { 015 return !param; 016 } 017 } 018 019 /** 020 * TRUE. 021 */ 022 public static class True implements IPredicate<Boolean> { 023 private True() { } 024 public static final True ONLY = new True(); 025 public Boolean apply(Boolean param) { 026 return true; 027 } 028 } 029 030 /** 031 * FALSE. 032 */ 033 public static class False implements IPredicate<Boolean> { 034 private False() { } 035 public static final False ONLY = new False(); 036 public Boolean apply(Boolean param) { 037 return false; 038 } 039 } 040 041 /** 042 * Binary predicate interface Boolean <- P x Q. 043 */ 044 public static interface Binary<P, Q> extends ILambda.Binary<Boolean, P, Q> { 045 /** 046 * Unary decorator for a binary predicate that binds a constant to its first parameter. 047 */ 048 public static class Bind1st<Boolean, P, Q> extends ILambda.Binary.Bind1st<Boolean, P, Q> { 049 public Bind1st(Binary<Boolean, P, Q> decoree, P constant) { 050 super(decoree, constant); 051 } 052 } 053 054 /** 055 * Unary decorator for a binary predicate that binds a constant to its second parameter. 056 */ 057 public static class Bind2nd<Boolean, P, Q> extends ILambda.Binary.Bind2nd<Boolean, P, Q> { 058 public Bind2nd(Binary<Boolean, P, Q> decoree, Q constant) { 059 super(decoree, constant); 060 } 061 } 062 063 /** 064 * TRUE. 065 */ 066 public static class True implements IPredicate.Binary<Boolean, Boolean> { 067 private True() { } 068 public static final True ONLY = new True(); 069 public Boolean apply(Boolean param1, Boolean param2) { 070 return true; 071 } 072 } 073 074 /** 075 * FALSE. 076 */ 077 public static class False implements IPredicate.Binary<Boolean, Boolean> { 078 private False() { } 079 public static final False ONLY = new False(); 080 public Boolean apply(Boolean param1, Boolean param2) { 081 return false; 082 } 083 } 084 085 /** 086 * Binary AND. 087 */ 088 public static class And implements IPredicate.Binary<Boolean, Boolean> { 089 private And() { } 090 public static final And ONLY = new And(); 091 public Boolean apply(Boolean param1, Boolean param2) { 092 return (param1 && param2); 093 } 094 } 095 096 /** 097 * Binary OR. 098 */ 099 public static class Or implements IPredicate.Binary<Boolean, Boolean> { 100 private Or() { } 101 public static final Or ONLY = new Or(); 102 public Boolean apply(Boolean param1, Boolean param2) { 103 return (param1 || param2); 104 } 105 } 106 107 /** 108 * Binary XOR. 109 */ 110 public static class Xor implements IPredicate.Binary<Boolean, Boolean> { 111 private Xor() { } 112 public static final Xor ONLY = new Xor(); 113 public Boolean apply(Boolean param1, Boolean param2) { 114 return (param1 ^ param2); 115 } 116 } 117 118 /** 119 * Less-than. 120 */ 121 public static class Less<T extends Comparable<T>> implements IPredicate.Binary<T, T> { 122 public Boolean apply(T param1, T param2) { 123 return (param1.compareTo(param2) < 0); 124 } 125 } 126 127 /** 128 * Greater-than. 129 */ 130 public static class Greater<T extends Comparable<T>> implements IPredicate.Binary<T, T> { 131 public Boolean apply(T param1, T param2) { 132 return (param1.compareTo(param2) > 0); 133 } 134 } 135 136 /** 137 * Less-than-or-equal. 138 */ 139 public static class LessEq<T extends Comparable<T>> implements IPredicate.Binary<T, T> { 140 public Boolean apply(T param1, T param2) { 141 return (param1.compareTo(param2) <= 0); 142 } 143 } 144 145 /** 146 * Greater-than-or-equal. 147 */ 148 public static class GreaterEq<T extends Comparable<T>> implements IPredicate.Binary<T, T> { 149 public Boolean apply(T param1, T param2) { 150 return (param1.compareTo(param2) >= 0); 151 } 152 } 153 154 /** 155 * Equals. 156 */ 157 public static class Equals implements IPredicate.Binary<Object, Object> { 158 private Equals() { } 159 public static final Equals ONLY = new Equals(); 160 public Boolean apply(Object param1, Object param2) { 161 return param1.equals(param2); 162 } 163 } 164 } 165 166 /** 167 * Ternary predicate interface Boolean <- P x Q x S. 168 */ 169 public static interface Ternary<P, Q, S> extends ILambda.Ternary<Boolean, P, Q, S> { 170 /** 171 * Binary decorator for a ternary predicate that binds a constant to its first parameter. 172 */ 173 public static class Bind1st<Boolean, P, Q, S> extends ILambda.Ternary.Bind1st<Boolean, P, Q, S> { 174 public Bind1st(ILambda.Ternary<Boolean, P, Q, S> decoree, P constant) { 175 super(decoree, constant); 176 } 177 } 178 179 /** 180 * Binary decorator for a ternary predicate that binds a constant to its second parameter. 181 */ 182 public static class Bind2nd<Boolean, P, Q, S> extends ILambda.Ternary.Bind2nd<Boolean, P, Q, S> { 183 public Bind2nd(ILambda.Ternary<Boolean, P, Q, S> decoree, Q constant) { 184 super(decoree, constant); 185 } 186 } 187 188 /** 189 * Binary decorator for a ternary predicate that binds a constant to its third parameter. 190 */ 191 public static class Bind3rd<Boolean, P, Q, S> extends ILambda.Ternary.Bind3rd<Boolean, P, Q, S> { 192 public Bind3rd(ILambda.Ternary<Boolean, P, Q, S> decoree, S constant) { 193 super(decoree, constant); 194 } 195 } 196 197 /** 198 * Unary decorator for a ternary predicate that binds constants to its first and second parameters. 199 */ 200 public static class Bind1st2nd<Boolean, P, Q, S> extends ILambda.Ternary.Bind1st2nd<Boolean, P, Q, S> { 201 public Bind1st2nd(Ternary<Boolean, P, Q, S> decoree, P constant1, Q constant2) { 202 super(decoree, constant1, constant2); 203 } 204 } 205 206 /** 207 * Unary decorator for a ternary predicate that binds constants to its first and third parameters. 208 */ 209 public static class Bind1st3rd<Boolean, P, Q, S> extends ILambda.Ternary.Bind1st3rd<Boolean, P, Q, S> { 210 public Bind1st3rd(Ternary<Boolean, P, Q, S> decoree, P constant1, S constant3) { 211 super(decoree, constant1, constant3); 212 } 213 } 214 215 /** 216 * Unary decorator for a ternary predicate that binds constants to its second and third parameters. 217 */ 218 public static class Bind2nd3rd<Boolean, P, Q, S> extends ILambda.Ternary.Bind2nd3rd<Boolean, P, Q, S> { 219 public Bind2nd3rd(Ternary<Boolean, P, Q, S> decoree, Q constant2, S constant3) { 220 super(decoree, constant2, constant3); 221 } 222 } 223 224 /** 225 * TRUE. 226 */ 227 public static class True implements IPredicate.Ternary<Boolean, Boolean, Boolean> { 228 private True() { } 229 public static final True ONLY = new True(); 230 public Boolean apply(Boolean param1, Boolean param2, Boolean param3) { 231 return true; 232 } 233 } 234 235 /** 236 * FALSE. 237 */ 238 public static class False implements IPredicate.Ternary<Boolean, Boolean, Boolean> { 239 private False() { } 240 public static final False ONLY = new False(); 241 public Boolean apply(Boolean param1, Boolean param2, Boolean param3) { 242 return false; 243 } 244 } 245 246 /** 247 * Ternary AND. 248 */ 249 public static class And implements IPredicate.Ternary<Boolean, Boolean, Boolean> { 250 private And() { } 251 public static final And ONLY = new And(); 252 public Boolean apply(Boolean param1, Boolean param2, Boolean param3) { 253 return (param1 && param2 && param3); 254 } 255 } 256 257 /** 258 * Ternary OR. 259 */ 260 public static class Or implements IPredicate.Ternary<Boolean, Boolean, Boolean> { 261 private Or() { } 262 public static final Or ONLY = new Or(); 263 public Boolean apply(Boolean param1, Boolean param2, Boolean param3) { 264 return (param1 || param2 || param3); 265 } 266 } 267 268 /** 269 * Ternary XOR. 270 */ 271 public static class Xor implements IPredicate.Ternary<Boolean, Boolean, Boolean> { 272 private Xor() { } 273 public static final Xor ONLY = new Xor(); 274 public Boolean apply(Boolean param1, Boolean param2, Boolean param3) { 275 return ((param1 ^ param2) && !param3) || ((param1 ^ param3) && !param2) || ((param2 ^ param3) && !param1); 276 } 277 } 278 279 /** 280 * Between. 281 */ 282 public static class Between<T extends Comparable<T>> implements IPredicate.Ternary<T, T, T> { 283 /** @return true iff param1 >= param2 and param1 <= param3 */ 284 public Boolean apply(T param1, T param2, T param3) { 285 return (param1.compareTo(param2) >= 0) && (param1.compareTo(param3) <= 0); 286 } 287 } 288 } 289 290 /** 291 * N-ary predicate interface Boolean <- P x P x ... x P. 292 */ 293 public static interface Nary<P> extends ILambda.Nary<Boolean, P> { 294 /** 295 * (N-1)-ary decorator for an N-ary predicate that binds a constant to one of its parameters. 296 */ 297 public static class Bind<P> extends ILambda.Nary.Bind<Boolean, P> { 298 public Bind(ILambda.Nary<Boolean, P> decoree, int index, P constant) { 299 super(decoree, index, constant); 300 } 301 } 302 303 /** 304 * (N-K)-ary decorator for an N-ary predicate that binds constants to K of its parameters. 305 */ 306 public static class BindK<P> extends ILambda.Nary.BindK<Boolean, P> { 307 public BindK(ILambda.Nary<Boolean, P> decoree, int[] indices, P... constants) { 308 super(decoree, indices, constants); 309 } 310 } 311 312 /** 313 * TRUE. 314 */ 315 public static class True implements IPredicate.Nary<Boolean> { 316 private True() { } 317 public static final True ONLY = new True(); 318 public Boolean apply(Boolean ... param) { 319 return true; 320 } 321 } 322 323 /** 324 * FALSE. 325 */ 326 public static class False implements IPredicate.Nary<Boolean> { 327 private False() { } 328 public static final False ONLY = new False(); 329 public Boolean apply(Boolean ... param) { 330 return false; 331 } 332 } 333 334 /** 335 * N-ary AND. 336 */ 337 public static class And implements IPredicate.Nary<Boolean> { 338 private And() { } 339 public static final And ONLY = new And(); 340 public Boolean apply(Boolean ... param) { 341 boolean accum = true; 342 for (Boolean b: param) { accum &= b; } 343 return accum; 344 } 345 } 346 347 /** 348 * N-ary OR. 349 */ 350 public static class Or implements IPredicate.Nary<Boolean> { 351 private Or() { } 352 public static final Or ONLY = new Or(); 353 public Boolean apply(Boolean ... param) { 354 boolean accum = false; 355 for (Boolean b: param) { accum |= b; } 356 return accum; 357 } 358 } 359 360 /** 361 * N-ary XOR. 362 */ 363 public static class Xor implements IPredicate.Nary<Boolean> { 364 private Xor() { } 365 public static final Xor ONLY = new Xor(); 366 public Boolean apply(Boolean ... param) { 367 int trueCount = 0; 368 for (Boolean b: param) { if (b) ++trueCount; } 369 return (trueCount == 1); 370 } 371 } 372 } 373 }