public class AnyMValueImpl<T> extends BaseAnyMImpl<T> implements AnyMValue<T>
AnyM.AnyMFactory
ApplicativeFunctor.Applicatives, ApplicativeFunctor.ApplyFunctions<T>
Value.ValueImpl<T>
Convertable.SupplierToConvertable<T>
initialType, monad
Constructor and Description |
---|
AnyMValueImpl(Monad<T> monad,
java.lang.Class initialType) |
Modifier and Type | Method and Description |
---|---|
AnyMValue<java.util.List<T>> |
aggregate(AnyM<T> next)
Aggregate the contents of this Monad and the supplied Monad
|
<R> AnyMValue<R> |
applyM(AnyMValue<java.util.function.Function<? super T,? extends R>> fn)
Apply function/s inside supplied Monad to data in current Monad
e.g.
|
<R> AnyMValue<R> |
bind(java.util.function.Function<? super T,?> fn)
Perform a looser typed flatMap / bind operation
The return type can be another type other than the host type
Note the modified javaslang monad laws are not applied during the looser typed bind operation
The modification being used to work around the limits of the Java type system.
|
<T2,R> AnyMValue<R> |
combine(Value<? extends T2> app,
java.util.function.BiFunction<? super T,? super T2,? extends R> fn)
Lazily combine this ApplicativeFunctor with the supplied value via the supplied BiFunction
|
<T> AnyMValue<T> |
empty()
Construct an AnyM wrapping a new empty instance of the wrapped type
e.g.
|
<T> AnyMValue<T> |
emptyUnit() |
boolean |
equals(java.lang.Object obj) |
AnyMValue<T> |
filter(java.util.function.Predicate<? super T> p)
Perform a filter operation on the wrapped monad instance e.g.
|
<R> AnyMValue<R> |
flatMap(java.util.function.Function<? super T,? extends AnyMValue<? extends R>> fn)
flatMap operation
AnyM follows the javaslang modified 'monad' laws https://gist.github.com/danieldietrich/71be006b355d6fbc0584
In particular left-identity becomes
Left identity: unit(a).flatMap(f) ≡ select(f.apply(a))
Or in plain English, if your flatMap function returns multiple values (such as flatMap by Stream) but the current Monad only can only hold one value,
only the first value is accepted.
|
<R> AnyMValue<R> |
flatMapFirst(java.util.function.Function<? super T,? extends java.lang.Iterable<? extends R>> fn)
Perform a flatMap operation that will only work as normal for AnyMSeq types, but for AnyMValue (which can only hold a single value)
will take the first value from the Iterable returned.
|
<R> AnyMValue<R> |
flatMapFirstPublisher(java.util.function.Function<? super T,? extends org.reactivestreams.Publisher<? extends R>> fn)
Perform a flatMap operation that will only work as normal for AnyMSeq types, but for AnyMValue (which can only hold a single value)
will take the first value from the Publisher returned.
|
<T1> AnyMValue<T1> |
flatten()
join / flatten one level of a nested hierarchy
|
<R1,R> AnyMValue<R> |
forEach2(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad,
java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends R>> yieldingFunction)
Perform a two level nested internal iteration over this Stream and the supplied monad (allowing null handling, exception handling
etc to be injected, for example)
|
<R1,R> AnyMValue<R> |
forEach2(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad,
java.util.function.Function<? super T,java.util.function.Function<? super R1,java.lang.Boolean>> filterFunction,
java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends R>> yieldingFunction)
Perform a two level nested internal iteration over this Stream and the supplied monad (allowing null handling, exception handling
etc to be injected, for example)
|
<R1,R2,R> AnyMValue<R> |
forEach3(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad1,
java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends AnyMValue<R2>>> monad2,
java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,? extends R>>> yieldingFunction)
Perform a three level nested internal iteration over this AnyM and the supplied monads
|
<R1,R2,R> AnyMValue<R> |
forEach3(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad1,
java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends AnyMValue<R2>>> monad2,
java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,java.lang.Boolean>>> filterFunction,
java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,? extends R>>> yieldingFunction)
Perform a three level nested internal iteration over this Stream and the supplied streams
|
T |
get() |
int |
hashCode() |
boolean |
isPresent() |
<R> AnyMValue<R> |
map(java.util.function.Function<? super T,? extends R> fn)
Perform a map operation on the wrapped monad instance e.g.
|
Xor<AnyMValue<T>,AnyMSeq<T>> |
matchable()
Allows structural matching on the value / seq nature of this AnyM.
|
AnyMValue<T> |
peek(java.util.function.Consumer<? super T> c)
Perform a peek operation on the wrapped monad e.g.
|
ReactiveSeq<T> |
reactiveSeq() |
AnyMValue<java.util.List<T>> |
replicateM(int times)
Replicate given Monad
|
ReactiveSeq<T> |
stream() |
<NT> ReactiveSeq<NT> |
toReactiveSeq(java.util.function.Function<? super T,? extends java.util.stream.Stream<? extends NT>> fn)
Sequence the contents of a Monad.
|
<NT> ReactiveSeq<NT> |
toSequence()
Optional<List<Integer>> into Stream<Integer> |
java.lang.String |
toString() |
<T> AnyMValue<T> |
unit(T value)
Construct a new instanceof AnyM using the type of the underlying wrapped monad
|
<T> T |
unwrap()
Unwrap a wrapped value
|
<T2,R> AnyMValue<R> |
zip(java.util.function.BiFunction<? super T,? super T2,? extends R> fn,
org.reactivestreams.Publisher<? extends T2> app)
Zip (combine) this Zippable with the supplied Publisher, using the supplied combining function
|
<T2,R> AnyMValue<R> |
zip(java.lang.Iterable<? extends T2> app,
java.util.function.BiFunction<? super T,? super T2,? extends R> fn)
Zip (combine) this Zippable with the supplied Iterable using the supplied combining function
|
asSequence, bindInternal, filterInternal, flatMapInternal, flattenInternal, forEach, fromIterable, fromPublisher, mapInternal, monad, peekInternal, reduceMSeq, reduceMValue
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
cast, coflatMap, collect, combine, eqv, filterNot, iterator, liftM, liftM2, liftM2, liftM3, liftM3, liftM3Cyclops, liftM4, liftM4, liftM4Cyclops, liftM5, liftM5, liftM5Cyclops, mkString, nest, notNull, ofType, patternMatch, sequence, sequence, toFirstValue, trampoline, traverse, traverse
eqv, fromArray, fromCompletableFuture, fromCompletableFutureTSeq, fromCompletableFutureTValue, fromDoubleStream, fromEval, fromEvalTSeq, fromEvalTValue, fromFeatureToggle, fromFutureW, fromFutureWTSeq, fromFutureWTValue, fromIntStream, fromIor, fromIterable, fromIterableValue, fromList, fromListT, fromLongStream, fromMaybe, fromMaybeTSeq, fromMaybeTValue, fromOptional, fromOptionalDouble, fromOptionalInt, fromOptionalLong, fromOptionalTSeq, fromOptionalTValue, fromPublisher, fromRange, fromRangeLong, fromSet, fromSetT, fromStream, fromStreamable, fromStreamableT, fromStreamT, fromTry, fromTryTSeq, fromTryTValue, fromXor, fromXorTSeq, fromXorTValue, liftM3, liftM4, liftM5, listFromCompletableFuture, listFromEval, listFromFutureW, listFromIor, listFromIterable, listFromIterator, listFromMaybe, listFromOptional, listFromStream, listFromStreamable, listFromXor, ofConvertableSeq, ofConvertableValue, ofNullable, ofSeq, ofValue, reduceMSeq, reduceMValue, sequence, sequence, streamOf, traverse, traverse
futureStream, getStreamable, isEmpty, jdkStream, reveresedJDKStream, reveresedStream
applyFunctions
fold, fold, generate, iterate, newSubscriber, of, toDequeX, toEvalAlways, toEvalLater, toEvalNow, toFeatureToggle, toFutureStream, toFutureStream, toIor, toLazyImmutable, toListX, toMaybe, toMutable, toPBagX, toPOrderedSetX, toPQueueX, toPSetX, toPStackX, toPVectorX, toQueueX, toSetX, toSimpleReact, toSimpleReact, toSortedSetX, toTry, toTry, toTry, toXor, toXor, unapply
endsWith, endsWithIterable, findAny, findFirst, firstValue, foldable, foldRight, foldRight, foldRight, foldRightMapToType, get, groupBy, join, join, join, mapReduce, print, print, printErr, printOut, reduce, reduce, reduce, reduce, reduce, reduce, reduce, schedule, scheduleFixedDelay, scheduleFixedRate, single, single, singleOptional, startsWith, startsWithIterable, toConcurrentLazyCollection, toConcurrentLazyStreamable, toLazyCollection, validate, xMatch
collect, fromSupplier, orElse, orElseGet, orElseThrow, toAtomicReference, toCompletableFuture, toCompletableFutureAsync, toCompletableFutureAsync, toFutureW, toFutureWAsync, toFutureWAsync, toOptional, toOptionalAtomicReference, toStream
anyM
toOptional, visit
matches
public Xor<AnyMValue<T>,AnyMSeq<T>> matchable()
AnyM
AnyM<String> monad;
monad.matchable().visit(v->handleValue(v.get()),s->handleSequence(s.toList()));
public <T2,R> AnyMValue<R> combine(Value<? extends T2> app, java.util.function.BiFunction<? super T,? super T2,? extends R> fn)
ApplicativeFunctor
public <T2,R> AnyMValue<R> zip(java.lang.Iterable<? extends T2> app, java.util.function.BiFunction<? super T,? super T2,? extends R> fn)
Zippable
public <T2,R> AnyMValue<R> zip(java.util.function.BiFunction<? super T,? super T2,? extends R> fn, org.reactivestreams.Publisher<? extends T2> app)
Zippable
public <R> AnyMValue<R> flatMapFirst(java.util.function.Function<? super T,? extends java.lang.Iterable<? extends R>> fn)
AnyM
flatMapFirst
in interface AnyM<T>
flatMapFirst
in interface AnyMValue<T>
fn
- FlatMaping functionpublic <R> AnyMValue<R> flatMapFirstPublisher(java.util.function.Function<? super T,? extends org.reactivestreams.Publisher<? extends R>> fn)
AnyM
flatMapFirstPublisher
in interface AnyM<T>
flatMapFirstPublisher
in interface AnyMValue<T>
fn
- FlatMaping functionpublic ReactiveSeq<T> reactiveSeq()
reactiveSeq
in interface ConvertableToReactiveSeq<T>
reactiveSeq
in interface ToStream<T>
public T get()
get
in interface Convertable<T>
get
in interface java.util.function.Supplier<T>
get
in class BaseAnyMImpl<T>
public boolean isPresent()
isPresent
in interface Convertable<T>
public <T> AnyMValue<T> emptyUnit()
public AnyMValue<java.util.List<T>> replicateM(int times)
AnyMValue
AnyM<Optional<Integer>> applied =AnyM.fromOptional(Optional.of(2)).replicateM(5);
//AnyM[Optional[List(2,2,2,2,2)]]
replicateM
in interface AnyMValue<T>
times
- number of times to replicatepublic AnyMValue<T> filter(java.util.function.Predicate<? super T> p)
AnyM
AnyM.fromOptional(Optional.of(10)).filter(i->i<10);
//AnyM[Optional.empty()]
AnyM.fromStream(Stream.of(5,10)).filter(i->i<10);
//AnyM[Stream[5]]
public AnyMValue<T> peek(java.util.function.Consumer<? super T> c)
AnyM
AnyM.fromCompletableFuture(CompletableFuture.supplyAsync(()->loadData())
.peek(System.out::println)
public AnyMValue<java.util.List<T>> aggregate(AnyM<T> next)
BaseAnyMImpl
List<Integer> result = anyM(Stream.of(1,2,3,4))
.aggregate(anyM(Optional.of(5)))
.asSequence()
.toList();
assertThat(result,equalTo(Arrays.asList(1,2,3,4,5)));
public <T> AnyMValue<T> unit(T value)
AnyM
AnyM<Integer> ints = AnyM.fromList(Arrays.asList(1,2,3);
AnyM<String> string = ints.unit("hello");
unit
in interface AnyM<T>
unit
in interface AnyMValue<T>
unit
in interface MonadicValue<T>
unit
in interface Unit<T>
unit
in class BaseAnyMImpl<T>
value
- to embed inside the monad wrapped by AnyMpublic <T> AnyMValue<T> empty()
AnyM
Any<Integer> ints = AnyM.fromStream(Stream.of(1,2,3));
AnyM<Integer> empty=ints.empty();
public <NT> ReactiveSeq<NT> toReactiveSeq(java.util.function.Function<? super T,? extends java.util.stream.Stream<? extends NT>> fn)
BaseAnyMImpl
Optional<List<Integer>> into Stream<Integer>
List<Integer> list = anyM(Optional.of(Arrays.asList(1,2,3,4,5,6)))
.<Integer>toSequence(c->c.stream())
.collect(Collectors.toList());
assertThat(list,hasItems(1,2,3,4,5,6));
toReactiveSeq
in interface AnyM<T>
toReactiveSeq
in interface AnyMValue<T>
toReactiveSeq
in class BaseAnyMImpl<T>
fn
- Function used to convert contents to Streampublic ReactiveSeq<T> stream()
stream
in interface AnyM<T>
stream
in interface AnyMValue<T>
stream
in interface Foldable<T>
stream
in interface ToStream<T>
stream
in interface Value<T>
stream
in class BaseAnyMImpl<T>
com.aol.cyclops.control.ReativeSeq
) of it's elementspublic <R> AnyMValue<R> map(java.util.function.Function<? super T,? extends R> fn)
AnyM
AnyM.fromIterable(Try.runWithCatch(this::loadData))
.map(data->transform(data))
AnyM.fromStream(Stream.of(1,2,3))
.map(i->i+2);
//AnyM[Stream[3,4,5]]
map
in interface AnyM<T>
map
in interface AnyMValue<T>
map
in interface ConvertableFunctor<T>
map
in interface Functor<T>
map
in interface MonadicValue<T>
fn
- Mapping functionpublic <R> AnyMValue<R> bind(java.util.function.Function<? super T,?> fn)
AnyM
AnyM<List<Integer>> m = AnyM.fromStream(Stream.of(Arrays.asList(1,2,3),Arrays.asList(1,2,3)));
AnyM<Integer> intM = m.bind(Collection::stream);
public <T1> AnyMValue<T1> flatten()
AnyM
public <R1,R> AnyMValue<R> forEach2(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad, java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends R>> yieldingFunction)
AnyMValue
AnyM.fromArray(1,2,3)
.forEachAnyM2(a->AnyM.fromIntStream(IntStream.range(10,13)),
a->b->a+b);
//AnyM[11,14,12,15,13,16]
public <R1,R> AnyMValue<R> forEach2(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad, java.util.function.Function<? super T,java.util.function.Function<? super R1,java.lang.Boolean>> filterFunction, java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends R>> yieldingFunction)
AnyMValue
AnyM.fromArray(1,2,3)
.forEach2(a->AnyM.fromIntStream(IntStream.range(10,13)),
a->b-> a<3 && b>10,
a->b->a+b);
//AnyM[14,15]
forEach2
in interface AnyMValue<T>
monad
- Nested Monad to iterate overfilterFunction
- Filter to apply over elements before passing non-filtered values to the yielding functionyieldingFunction
- Function with pointers to the current element from both monads that generates the new elementspublic <R1,R2,R> AnyMValue<R> forEach3(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad1, java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends AnyMValue<R2>>> monad2, java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,java.lang.Boolean>>> filterFunction, java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,? extends R>>> yieldingFunction)
AnyMValue
AnyM.fromArray(1,2)
.forEach2(a->AnyM.fromIntStream(IntStream.range(10,13)),
(a->b->AnyM.fromArray(""+(a+b),"hello world"),
a->b->c->c+":"a+":"+b);
//AnyM[11:1:2,hello world:1:2,14:1:4,hello world:1:4,12:1:2,hello world:1:2,15:1:5,hello world:1:5]
forEach3
in interface AnyMValue<T>
monad1
- Nested monad to flatMap overfilterFunction
- Filter to apply over elements before passing non-filtered values to the yielding functionyieldingFunction
- Function with pointers to the current element from both monads that generates the new elementspublic <R1,R2,R> AnyMValue<R> forEach3(java.util.function.Function<? super T,? extends AnyMValue<R1>> monad1, java.util.function.Function<? super T,java.util.function.Function<? super R1,? extends AnyMValue<R2>>> monad2, java.util.function.Function<? super T,java.util.function.Function<? super R1,java.util.function.Function<? super R2,? extends R>>> yieldingFunction)
AnyMValue
AnyM.fromArray(1,2,3)
.forEach3(a->AnyM.fromStream(IntStream.range(10,13)),
a->b->AnyM.fromArray(""+(a+b),"hello world"),
a->b->c-> c!=3,
a->b->c->c+":"a+":"+b);
//ReactiveSeq[11:1:2,hello world:1:2,14:1:4,hello world:1:4,12:1:2,hello world:1:2,15:1:5,hello world:1:5]
forEach3
in interface AnyMValue<T>
monad1
- Nested Stream to iterate overmonad2
- Nested Stream to iterate overyieldingFunction
- Function with pointers to the current element from both Monads that generates the new elementspublic <R> AnyMValue<R> flatMap(java.util.function.Function<? super T,? extends AnyMValue<? extends R>> fn)
AnyMValue
AnyM<Integer> anyM = AnyM.fromStream(Stream.of(1,2,3)).flatMap(i->AnyM.fromArray(i+1,i+2));
//AnyM[Stream[2,3,3,4,4,5]]
Example 2 : multi-values are not supported (AnyM wraps a Stream, List, Set etc)
AnyM<Integer> anyM = AnyM.fromOptional(Optional.of(1)).flatMap(i->AnyM.fromArray(i+1,i+2));
//AnyM[Optional[2]]
public <T> T unwrap()
Unwrapable
unwrap
in interface AnyM<T>
unwrap
in interface Unwrapable
unwrap
in class BaseAnyMImpl<T>
public java.lang.String toString()
public int hashCode()
hashCode
in class java.lang.Object
public boolean equals(java.lang.Object obj)
equals
in class java.lang.Object
public <R> AnyMValue<R> applyM(AnyMValue<java.util.function.Function<? super T,? extends R>> fn)
AnyMValue
AnyM<Integer> applied =AnyM.fromStream(Stream.of(1,2,3))
.applyM(AnyM.fromStreamable(Streamable.of( (Integer a)->a+1 ,(Integer a) -> a*2)));
assertThat(applied.toList(),equalTo(Arrays.asList(2, 2, 3, 4, 4, 6)));
with Optionals
Any<Integer> applied =AnyM.fromOptional(Optional.of(2)).applyM(AnyM.fromOptional(Optional.of( (Integer a)->a+1)) );
assertThat(applied.toList(),equalTo(Arrays.asList(3)));
public <NT> ReactiveSeq<NT> toSequence()
BaseAnyMImpl
Optional<List<Integer>> into Stream<Integer>
Less type safe equivalent, but may be more accessible than toSequence(fn) i.e.
toSequence(Function<T,Stream<NT>> fn)
List<Integer> list = anyM(Optional.of(Arrays.asList(1,2,3,4,5,6)))
.<Integer>toSequence()
.collect(Collectors.toList());
toSequence
in interface AnyMValue<T>
toSequence
in class BaseAnyMImpl<T>