diff --git a/cyclops-pure/src/main/java/cyclops/instances/control/ConstantInstances.java b/cyclops-pure/src/main/java/cyclops/instances/control/ConstantInstances.java index e1af4d9bf1..d86b33fa41 100644 --- a/cyclops-pure/src/main/java/cyclops/instances/control/ConstantInstances.java +++ b/cyclops-pure/src/main/java/cyclops/instances/control/ConstantInstances.java @@ -40,6 +40,7 @@ public Higher, T2> apply(Higher, T2 } + public static Applicative> applicative(Monoid m){ return new Applicative>(){ diff --git a/cyclops-pure/src/main/java/cyclops/instances/control/EitherInstances.java b/cyclops-pure/src/main/java/cyclops/instances/control/EitherInstances.java index 6d3fdd3f09..cd9dc873a9 100644 --- a/cyclops-pure/src/main/java/cyclops/instances/control/EitherInstances.java +++ b/cyclops-pure/src/main/java/cyclops/instances/control/EitherInstances.java @@ -1,5 +1,6 @@ package cyclops.instances.control; +import com.oath.cyclops.hkt.DataWitness; import com.oath.cyclops.hkt.DataWitness.either; import com.oath.cyclops.hkt.Higher; import com.oath.cyclops.hkt.Higher2; @@ -23,6 +24,7 @@ import cyclops.typeclasses.functor.BiFunctor; import cyclops.typeclasses.functor.Functor; import cyclops.typeclasses.monad.*; +import lombok.AllArgsConstructor; import java.util.function.Function; @@ -44,7 +46,7 @@ public static Nested,W2,R> mapM(Either e } public static Kleisli,Either,T> kindKleisli(){ - return Kleisli.of(EitherInstances.monad(), Either::widen); + return Kleisli.of(getInstance(), Either::widen); } public static Cokleisli,T,Either> kindCokleisli(){ return Cokleisli.of(Either::narrowK); @@ -57,329 +59,193 @@ public static InstanceDefinitions> definitions(){ return new InstanceDefinitions>() { @Override public Functor> functor() { - return EitherInstances.functor(); + return EitherInstances.INSTANCE; } @Override public Pure> unit() { - return EitherInstances.unit(); + return EitherInstances.INSTANCE; } @Override public Applicative> applicative() { - return EitherInstances.applicative(); + return EitherInstances.INSTANCE; } @Override public Monad> monad() { - return EitherInstances.monad(); + return EitherInstances.INSTANCE; } @Override public Option>> monadZero() { - return Option.some(EitherInstances.monadZero()); + return Option.none(); } @Override public Option>> monadPlus() { - return Option.some(EitherInstances.monadPlus()); + return Option.none(); } @Override public MonadRec> monadRec() { - return EitherInstances.monadRec(); + return EitherInstances.INSTANCE; } @Override public Option>> monadPlus(MonoidK> m) { - return Option.some(EitherInstances.monadPlus(m)); + return Option.none(); } @Override public Traverse> traverse() { - return EitherInstances.traverse(); + return EitherInstances.INSTANCE; } @Override public Foldable> foldable() { - return EitherInstances.foldable(); + return EitherInstances.INSTANCE; } @Override public Option>> comonad() { - return Maybe.nothing(); + return Option.none(); } @Override public Option>> unfoldable() { - return Maybe.nothing(); - } - }; - } - public static Functor> functor() { - return new Functor>() { - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.map(fn); - } - }; - } - public static Pure> unit() { - return new Pure>() { - - @Override - public Higher, T> unit(T value) { - return Either.right(value); - } - }; - } - public static Applicative> applicative() { - return new Applicative>() { - - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - Either xor = narrowK(apply); - Either> xorFn = narrowK(fn); - return xorFn.zip(xor,(a,b)->a.apply(b)); - - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.functor().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.unit().unit(value); - } - }; - } - public static Monad> monad() { - return new Monad>() { - - @Override - public Higher, R> flatMap(Function, R>> fn, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.flatMap(fn.andThen(Either::narrowK)); - } - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - return EitherInstances.applicative().ap(fn,apply); - - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.functor().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.unit().unit(value); - } - }; - } - public static MonadRec> monadRec() { - - return new MonadRec>(){ - @Override - public Higher, R> tailRec(T initial, Function, ? extends Either>> fn) { - return Either.tailRec(initial,fn.andThen(Either::narrowK)); - } - - - }; - - - } - public static BiFunctor bifunctor(){ - return new BiFunctor() { - @Override - public Higher2 bimap(Function fn, Function fn2, Higher2 ds) { - return narrowK(ds).bimap(fn,fn2); - } - }; - } - public static Traverse> traverse() { - return new Traverse>() { - - @Override - public Higher, R>> traverseA(Applicative applicative, Function> fn, Higher, T> ds) { - Either maybe = narrowK(ds); - return maybe.fold(left-> applicative.unit(Either.left(left)), - right->applicative.map(m-> Either.right(m), fn.apply(right))); - } - - @Override - public Higher, T>> sequenceA(Applicative applicative, Higher, Higher> ds) { - return traverseA(applicative,Function.identity(),ds); - } - - - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - return EitherInstances.applicative().ap(fn,apply); - - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.functor().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.unit().unit(value); - } - }; - } - public static Foldable> foldable() { - return new Foldable>() { - - - @Override - public T foldRight(Monoid monoid, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.fold(monoid); - } - - @Override - public T foldLeft(Monoid monoid, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.fold(monoid); - } - - @Override - public R foldMap(Monoid mb, Function fn, Higher, T> nestedA) { - return foldLeft(mb, narrowK(nestedA).map(fn)); - } - }; - } - public static MonadZero> monadZero() { - return new MonadZero>() { - - @Override - public Higher, ?> zero() { - return Either.left(null); - } - - @Override - public Higher, R> flatMap(Function, R>> fn, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.flatMap(fn.andThen(Either::narrowK)); - } - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - return EitherInstances.applicative().ap(fn,apply); - - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.functor().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.unit().unit(value); - } - }; - } - public static MonadPlus> monadPlus() { - Monoid m = Monoids.firstRightEither((Either) narrowK(EitherInstances.monadZero().zero())); - - MonoidK> m2 = new MonoidK>() { - @Override - public Higher, T> zero() { - return EitherInstances.monadPlus().zero(); - } - - @Override - public Higher, T> apply(Higher, T> t1, Higher, T> t2) { - return SemigroupKs.firstRightEither().apply(t1,t2); - } - }; - - return monadPlus(m2); - } - public static MonadPlus> monadPlus(MonoidK> m) { - return new MonadPlus>() { - - @Override - public MonoidK> monoid() { - return m; - } - - @Override - public Higher, ?> zero() { - return EitherInstances.monadZero().zero(); - } - - @Override - public Higher, R> flatMap(Function, R>> fn, Higher, T> ds) { - Either xor = narrowK(ds); - return xor.flatMap(fn.andThen(Either::narrowK)); - } - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - return EitherInstances.applicative().ap(fn,apply); - - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.functor().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.unit().unit(value); - } - }; - } - public static ApplicativeError,L> applicativeError(){ - return new ApplicativeError,L>() { - - @Override - public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { - return EitherInstances.applicative().ap(fn,apply); - } - - @Override - public Higher, R> map(Function fn, Higher, T> ds) { - return EitherInstances.applicative().map(fn,ds); - } - - @Override - public Higher, T> unit(T value) { - return EitherInstances.applicative().unit(value); - } - - @Override - public Higher, T> raiseError(L l) { - return Either.left(l); - } - - @Override - public Higher, T> handleErrorWith(Function, ? extends T>> fn, Higher, T> ds) { - Function> fn2 = fn.andThen(s -> { - - Higher, T> x = (Higher, T>)s; - Either r = narrowK(x); - return r; - }); - return narrowK(ds).flatMapLeftToRight(fn2); + return Option.none(); } }; } + private final static EitherTypeclasses INSTANCE = new EitherTypeclasses<>(); + + public static final EitherTypeclasses getInstance(){ + return INSTANCE; + } + + @AllArgsConstructor + public static class EitherTypeclasses implements Monad>, + MonadRec>, + TraverseByTraverse>, + Foldable>, + ApplicativeError,L>, + BiFunctor { + + + @Override + public T foldRight(Monoid monoid, Higher, T> ds) { + Either xor = narrowK(ds); + return xor.fold(monoid); + } + + @Override + public T foldLeft(Monoid monoid, Higher, T> ds) { + Either xor = narrowK(ds); + return xor.fold(monoid); + } + @Override + public R foldMap(Monoid mb, Function fn, Higher, T> nestedA) { + return foldLeft(mb, narrowK(nestedA).map(fn)); + } + + @Override + public Higher2 bimap(Function fn, Function fn2, Higher2 ds) { + return narrowK(ds).bimap(fn, fn2); + } + + @Override + public Higher, T> raiseError(L l) { + return Either.left(l); + } + + @Override + public Higher, T> handleErrorWith(Function, ? extends T>> fn, Higher, T> ds) { + Function> fn2 = fn.andThen(s -> { + + Higher, T> x = (Higher, T>) s; + Either r = narrowK(x); + return r; + }); + return narrowK(ds).flatMapLeftToRight(fn2); + } + + + @Override + public Higher, R> flatMap(Function, R>> fn, Higher, T> ds) { + Either xor = narrowK(ds); + return xor.flatMap(fn.andThen(Either::narrowK)); + } + + @Override + public Higher, R>> traverseA(Applicative applicative, Function> fn, Higher, T> ds) { + Either maybe = narrowK(ds); + return maybe.fold(left-> applicative.unit(Either.left(left)), + right->applicative.map(m-> Either.right(m), fn.apply(right))); + } + + @Override + public Higher, R> ap(Higher, ? extends Function> fn, Higher, T> apply) { + Either xor = narrowK(apply); + Either> xorFn = narrowK(fn); + return xorFn.zip(xor,(a,b)->a.apply(b)); + } + + @Override + public Higher, T> unit(T value) { + return Either.right(value); + } + + @Override + public Higher, R> map(Function fn, Higher, T> ds) { + Either xor = narrowK(ds); + return xor.map(fn); + } + + @Override + public Higher, R> tailRec(T initial, Function, ? extends Either>> fn) { + return Either.tailRec(initial,fn.andThen(Either::narrowK)); + } + } + + + public static Functor> functor() { + return INSTANCE; + } + public static Pure> unit() { + return INSTANCE; + } + public static Applicative> applicative() { + return INSTANCE; + } + public static Monad> monad() { + return INSTANCE; + } + public static MonadRec> monadRec() { + + return INSTANCE; + + + } + public static BiFunctor bifunctor(){ + return new BiFunctor() { + @Override + public Higher2 bimap(Function fn, Function fn2, Higher2 ds) { + return narrowK(ds).bimap(fn,fn2); + } + }; + } + public static Traverse> traverse() { + return INSTANCE; + } + public static Foldable> foldable() { + return INSTANCE; + } + + + public static ApplicativeError,L> applicativeError(){ + return INSTANCE; + } } diff --git a/cyclops-pure/src/test/java/cyclops/typeclasses/DoTest.java b/cyclops-pure/src/test/java/cyclops/typeclasses/DoTest.java index 20d73b4e59..e71d17bd87 100644 --- a/cyclops-pure/src/test/java/cyclops/typeclasses/DoTest.java +++ b/cyclops-pure/src/test/java/cyclops/typeclasses/DoTest.java @@ -83,7 +83,7 @@ public void doSeqLazy(){ @Test public void doEither(){ - Do.forEach(EitherInstances.monad()) + Do.forEach(EitherInstances.getInstance()) .__(Either.right(10)) .yield(i->i+1);