T - Input type for predicate and function (action)R - Return type for function (action) which is executed if the predicate tests positiveX - Type of Function - cyclops pattern matching builders use ActionWithReturn which is serialisable and retains type infopublic class Cases<T,R,X extends java.util.function.Function<T,R>>
extends java.lang.Object
implements java.util.function.Function<T,java.util.Optional<R>>
| Modifier and Type | Method and Description |
|---|---|
Cases<T,R,X> |
append(int index,
Case<T,R,X> pattern)
Append an individual case with supplied Cases inserted at index
|
java.util.Optional<R> |
apply(T t) |
<T1,X> java.util.function.Function<T1,java.util.stream.Stream<X>> |
asStreamFunction()
assertThat(Cases.of(Case.of(input->true,input->"hello")).asStreamFunction().apply(10).findFirst().get(),is("hello"));
|
<T1,X> java.util.function.Function<T1,X> |
asUnwrappedFunction()
assertThat(Cases.of(Case.of(input->true,input->"hello")).asUnwrappedFunction().apply(10),is("hello"));
|
Cases<T,R,X> |
filter(java.util.function.Predicate<Case<T,R,X>> predicate)
Filter the Cases with the supplied predicate
|
Cases<T,R,X> |
filterFunction(java.util.function.Predicate<java.util.function.Function<T,R>> predicate)
Filter the Cases with the supplied predicate
|
Cases<T,R,X> |
filterPredicate(java.util.function.Predicate<java.util.function.Predicate<T>> predicate)
Filter the Cases with the supplied predicate
|
<T1,R1,X1 extends java.util.function.Function<T1,R1>> |
flatMap(java.util.function.Function<Case<T,R,X>,Cases<T1,R1,X1>> mapper)
Expand each Case into a Cases object allowing 1:Many expansion of Cases
|
<T1,R1,X1 extends java.util.function.Function<T1,R1>> |
flatMapAll(java.util.function.Function<org.pcollections.PStack<Case<T,R,X>>,Cases<T1,R1,X1>> mapper)
Map to a new Cases instance via a function that is provided all current Cases
|
void |
forEach(java.util.function.Consumer<Case<T,R,X>> consumer)
Iterate over each case
|
org.pcollections.PStack<Case<T,R,X>> |
get() |
<T1,R1,X1 extends java.util.function.Function<T1,R1>> |
map(java.util.function.Function<Case<T,R,X>,Case<T1,R1,X1>> mapper)
Map all Case instances present to a different value
|
<R1> Cases<T,R,X> |
mapFunction(java.util.function.Function<java.util.function.Function<T,R>,java.util.function.Function<T,R1>> actionMapper)
Map all the functions to another function
|
Cases<T,R,X> |
mapPredicate(java.util.function.Function<java.util.function.Predicate<T>,java.util.function.Predicate<T>> predicateMapper)
Map predicates for all Cases with the supplied function
|
<R> java.util.Optional<R> |
match(java.lang.Object... t)
Aggregates supplied objects into a List for matching against
|
<R> java.util.Optional<R> |
match(T t) |
<R> java.util.concurrent.CompletableFuture<java.util.Optional<R>> |
matchAsync(java.util.concurrent.Executor executor,
java.lang.Object... t)
Aggregates supplied objects into a List for matching asynchronously against
|
<R> java.util.stream.Stream<R> |
matchFromStream(java.util.stream.Stream<T> s)
Each input element can generated a single matched value
|
<R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> |
matchFromStreamAsync(java.util.concurrent.Executor executor,
java.util.stream.Stream<T> s)
Execute matchFromStream asynchronously
|
<R> java.util.stream.Stream<R> |
matchMany(T t)
List<String> results = Cases.of(Case.of((Integer input)->10==input,input->"hello"),
Case.of(input->11==input,input->"world"),
Case.of(input->10==input,input->"woo!"))
.<String>matchMany(10).toList();
assertThat(results.size(),is(2));
assertThat(results,hasItem("hello"));
assertThat(results,hasItem("woo!"));
|
<R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> |
matchManyAsync(java.util.concurrent.Executor executor,
T t)
Match many asynchronously
|
<R> java.util.stream.Stream<R> |
matchManyFromStream(java.util.stream.Stream<T> s)
Each input element in the stream can generate multiple matched values
|
<R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> |
matchManyFromStreamAsync(java.util.concurrent.Executor executor,
java.util.stream.Stream s)
Asynchronously match against a Stream of data, on the supplied executor
Each input element in the stream can generate multiple matched values
|
Cases<T,R,X> |
merge(Cases<T,R,X> patterns)
Merge two cases, with supplied Cases added after current Cases
|
static <T,R,X extends java.util.function.Function<T,R>> |
of(Case<T,R,X>... cazes)
Construct a Cases instance from an array Pattern Matching Cases
Will execute sequentially when Match is called.
|
static <T,R,X extends java.util.function.Function<T,R>> |
ofList(java.util.List<Case<T,R,X>> cases)
Construct a Cases instance from a list of Pattern Matching Cases
Will execute sequentially when Match is called.
|
static <T,R,X extends java.util.function.Function<T,R>> |
ofPStack(org.pcollections.PStack<Case<T,R,X>> cases)
Construct a Cases instance from a persistent stack of Pattern Matching Cases
Will execute sequentially when Match is called.
|
Cases<T,R,X> |
parallel()
Default behaviour is to match sequentially
|
Cases<T,R,X> |
sequential()
This is the default behaviour, cases are matched sequentially when a matching function is called
|
int |
size() |
<R> java.util.Optional<R> |
unapply(com.aol.cyclops.lambda.api.Decomposable t)
Decomposes the supplied input via it's unapply method
Provides a List to the Matcher of values to match on
|
Two<java.util.stream.Stream<java.util.function.Predicate<T>>,java.util.stream.Stream<X>> |
unzip()
val cases = Cases.of(Case.of(input->true,input->"hello"));
val unzipped = cases.unzip();
assertTrue(unzipped.v1.map(p->p.test(10)).allMatch(v->v));
assertTrue(unzipped.v2.map(fn->fn.apply(10)).allMatch(v->"hello".equals(v)));
|
static <T,R,X extends java.util.function.Function<T,R>> |
zip(java.util.stream.Stream<java.util.function.Predicate<T>> predicates,
java.util.stream.Stream<X> functions)
Zip two Streams into pattern Matching Cases
|
public static <T,R,X extends java.util.function.Function<T,R>> Cases<T,R,X> ofPStack(org.pcollections.PStack<Case<T,R,X>> cases)
cases - Persistent Stack of cases to build Cases frompublic static <T,R,X extends java.util.function.Function<T,R>> Cases<T,R,X> ofList(java.util.List<Case<T,R,X>> cases)
cases - Persistent Stack of cases to build Cases frompublic static <T,R,X extends java.util.function.Function<T,R>> Cases<T,R,X> of(Case<T,R,X>... cazes)
cazes - Array of cases to build Cases instance frompublic static <T,R,X extends java.util.function.Function<T,R>> Cases<T,R,X> zip(java.util.stream.Stream<java.util.function.Predicate<T>> predicates, java.util.stream.Stream<X> functions)
predicates - Stream of predicatesfunctions - Stream of functionspublic Two<java.util.stream.Stream<java.util.function.Predicate<T>>,java.util.stream.Stream<X>> unzip()
val cases = Cases.of(Case.of(input->true,input->"hello"));
val unzipped = cases.unzip();
assertTrue(unzipped.v1.map(p->p.test(10)).allMatch(v->v));
assertTrue(unzipped.v2.map(fn->fn.apply(10)).allMatch(v->"hello".equals(v)));
public void forEach(java.util.function.Consumer<Case<T,R,X>> consumer)
consumer - accept each case in turnpublic Cases<T,R,X> sequential()
public Cases<T,R,X> parallel()
public Cases<T,R,X> merge(Cases<T,R,X> patterns)
patterns - Cases to merge to this setappend(int, com.aol.cyclops.matcher.Case<T, R, X>)public Cases<T,R,X> filter(java.util.function.Predicate<Case<T,R,X>> predicate)
cases = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.filter(p-> p.getPredicate().test(10));
assertThat(cases.size(),is(1));
predicate - to filter out casespublic Cases<T,R,X> filterPredicate(java.util.function.Predicate<java.util.function.Predicate<T>> predicate)
Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.filterPredicate(p-> p.test(10));
assertThat(cases.size(),is(1));
predicate - to filter out casespublic Cases<T,R,X> filterFunction(java.util.function.Predicate<java.util.function.Function<T,R>> predicate)
cases = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.filterFunction(fn-> fn.apply(10).equals("second"));
assertThat(cases.size(),is(1));
predicate - to filter out casespublic Cases<T,R,X> mapPredicate(java.util.function.Function<java.util.function.Predicate<T>,java.util.function.Predicate<T>> predicateMapper)
List results = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.mapPredicate(p->input->true).matchMany(10).collect(Collectors.toList());
assertThat(results.size(),is(2));
predicateMapper - Function to map the predicatespublic <R1> Cases<T,R,X> mapFunction(java.util.function.Function<java.util.function.Function<T,R>,java.util.function.Function<T,R1>> actionMapper)
List<String> results = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->true,input->"second"))
.mapFunction(fn->input->"prefix_"+fn.apply(input)).<String>matchMany(10).collect(Collectors.toList());
assertThat(results.size(),is(2));
assertTrue(results.stream().allMatch(s->s.startsWith("prefix_")));
assertTrue(results.stream().anyMatch(s->s.startsWith("prefix_hello")));
assertTrue(results.stream().anyMatch(s->s.startsWith("prefix_second")));
actionMapper - Function to apply mappingpublic <T1,R1,X1 extends java.util.function.Function<T1,R1>> Cases<T,R,X> map(java.util.function.Function<Case<T,R,X>,Case<T1,R1,X1>> mapper)
List<String> results = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.map(cse->Case.of(t->true,input->"prefix_"+cse.getAction().apply(input))).<String>matchMany(10).collect(Collectors.toList());
assertThat(results.size(),is(2));
assertTrue(results.stream().allMatch(s->s.startsWith("prefix_")));
assertTrue(results.stream().anyMatch(s->s.startsWith("prefix_hello")));
assertTrue(results.stream().anyMatch(s->s.startsWith("prefix_second")));
mapper - Function to map case instancespublic <T1,R1,X1 extends java.util.function.Function<T1,R1>> Cases<T,R,X> flatMap(java.util.function.Function<Case<T,R,X>,Cases<T1,R1,X1>> mapper)
Case<Object,Integer,Function<Object,Integer>> cse = Case.of(input-> input instanceof Person, input -> ((Person)input).getAge());
assertThat(Cases.of(cse).flatMap(c -> Cases.of(c.andThen(Case.of( age-> age<18,s->"minor")),
c.andThen(Case.of( age->age>=18,s->"adult")))).match(new Person("bob",21)).get(),is("adult"));
mapper - Function to map Case instances to Cases instancespublic <T1,R1,X1 extends java.util.function.Function<T1,R1>> Cases<T1,R1,X1> flatMapAll(java.util.function.Function<org.pcollections.PStack<Case<T,R,X>>,Cases<T1,R1,X1>> mapper)
cases = Cases.of(Case.of(input->true,input->"hello"),Case.of(input->false,input->"second"))
.flatMapAll(input-> Cases.of(input.plus(Case.of(in->true,in->"new"))));
assertThat(cases.size(),is(3));
mapper - Function to map to a new Cases instancepublic Cases<T,R,X> append(int index, Case<T,R,X> pattern)
index - to insert supplied cases in new Case instancepattern - Cases to append / insertmerge(com.aol.cyclops.matcher.Cases<T, R, X>)public int size()
public <T1,X> java.util.function.Function<T1,X> asUnwrappedFunction()
assertThat(Cases.of(Case.of(input->true,input->"hello")).asUnwrappedFunction().apply(10),is("hello"));
public <T1,X> java.util.function.Function<T1,java.util.stream.Stream<X>> asStreamFunction()
assertThat(Cases.of(Case.of(input->true,input->"hello")).asStreamFunction().apply(10).findFirst().get(),is("hello"));
public <R> java.util.stream.Stream<R> matchManyFromStream(java.util.stream.Stream<T> s)
List<String> results = Cases.of(Case.of((Integer input)->10==input,input->"hello"),
Case.of(input->11==input,input->"world"))
.<String>matchManyFromStream(Stream.of(1,10,11))
.toList();
assertThat(results.size(),is(2));
assertThat(results,hasItem("hello"));
assertThat(results,hasItem("world"));
s - Stream of data to match against (input to matcher)public <R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> matchManyFromStreamAsync(java.util.concurrent.Executor executor,
java.util.stream.Stream s)
List<String> results = Cases.of(Case.of((Integer input)->10==input,input->"hello"),
Case.of(input->11==input,input->"world"))
.<String>matchManyFromStreamAsync(ForkJoinPool.commonPool(),Stream.of(1,10,11))
.join()
.toList();
assertThat(results.size(),is(2));
assertThat(results,hasItem("hello"));
assertThat(results,hasItem("world"));
executor - used to perform async tasks - Stream of data to match against (input to matcher)public <R> java.util.stream.Stream<R> matchMany(T t)
List<String> results = Cases.of(Case.of((Integer input)->10==input,input->"hello"),
Case.of(input->11==input,input->"world"),
Case.of(input->10==input,input->"woo!"))
.<String>matchMany(10).toList();
assertThat(results.size(),is(2));
assertThat(results,hasItem("hello"));
assertThat(results,hasItem("woo!"));
t - input to match against - can generate multiple valuespublic <R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> matchManyAsync(java.util.concurrent.Executor executor,
T t)
List<String> results = Cases.of(Case.of((Integer input)->10==input,input->"hello"),
Case.of(input->11==input,input->"world"),
Case.of(input->10==input,input->"woo!"))
.<String>matchManyAsync(ForkJoinPool.commonPool(),10).join().toList();
assertThat(results.size(),is(2));
assertThat(results,hasItem("hello"));
assertThat(results,hasItem("woo!"));
executor - Executor to execute task asynchronouslyt - input to match against - can generate multiple valuespublic <R> java.util.stream.Stream<R> matchFromStream(java.util.stream.Stream<T> s)
List<String> results = Cases
.of(Case.of((Integer input) -> 10 == input, input -> "hello"),
Case.of((Integer input) -> 10 == input, input -> "ignored"),
Case.of(input -> 11 == input, input -> "world"))
.<String> matchFromStream(Stream.of(1, 11, 10)).toList();
assertThat(results.size(), is(2));
assertThat(results, hasItem("hello"));
assertThat(results, hasItem("world"));
s - Stream of data to match against (input to matcher)public <R> java.util.concurrent.CompletableFuture<java.util.stream.Stream<R>> matchFromStreamAsync(java.util.concurrent.Executor executor,
java.util.stream.Stream<T> s)
executor - executor Executor to execute task asynchronouslys - Stream of data
List<String> results = Cases
.of(Case.of((Integer input) -> 10 == input, input -> "hello"),
Case.of((Integer input) -> 10 == input, input -> "ignored"),
Case.of(input -> 11 == input, input -> "world"))
.<String> matchFromStreamAsync(ForkJoinPool.commonPool(),Stream.of(1, 11, 10)).join().toList();
assertThat(results.size(), is(2));
assertThat(results, hasItem("hello"));
assertThat(results, hasItem("world"));
public <R> java.util.Optional<R> match(java.lang.Object... t)
assertThat(Cases.of(Case.of((List<Integer> input) -> input.size()==3, input -> "hello"),
Case.of((List<Integer> input) -> input.size()==2, input -> "ignored"),
Case.of((List<Integer> input) -> input.size()==1, input -> "world")).match(1,2,3).get(),is("hello"));
t - Array to match onpublic <R> java.util.concurrent.CompletableFuture<java.util.Optional<R>> matchAsync(java.util.concurrent.Executor executor,
java.lang.Object... t)
assertThat(Cases.of(Case.of((List<Integer> input) -> input.size()==3, input -> "hello"),
Case.of((List<Integer> input) -> input.size()==2, input -> "ignored"),
Case.of((List<Integer> input) -> input.size()==1, input -> "world"))
.matchAsync(ForkJoinPool.commonPool(),1,2,3).join().get(),is("hello"));
executor - Executor to perform the async taskt - Array to match onpublic <R> java.util.Optional<R> unapply(com.aol.cyclops.lambda.api.Decomposable t)
assertThat(Cases.of(Case.of((List input) -> input.size()==3, input -> "hello"),
Case.of((List input) -> input.size()==2, input -> "ignored"),
Case.of((List input) -> input.size()==1, input -> "world"))
.unapply(new MyClass(1,"hello")).get(),is("ignored"));
\@Value static class MyClass implements Decomposable{ int value; String name; }
t - Object to decompose and match onpublic <R> java.util.Optional<R> match(T t)
t - Object to match against supplied cases