cyclops.instances.arrow.KleisliInstances Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cyclops-pure Show documentation
Show all versions of cyclops-pure Show documentation
Platform for Functional Reactive Programming with Java 8
The newest version!
package cyclops.instances.arrow;
import com.oath.cyclops.hkt.DataWitness.kleisli;
import com.oath.cyclops.hkt.Higher;
import cyclops.arrow.Kleisli;
import cyclops.typeclasses.Pure;
import cyclops.typeclasses.functor.Functor;
import cyclops.typeclasses.monad.Applicative;
import cyclops.typeclasses.monad.Monad;
import java.util.function.Function;
import static cyclops.arrow.Kleisli.narrowK;
public interface KleisliInstances {
public static Functor,IN>> functor() {
return new Functor, IN>>() {
@Override
public Higher, IN>, R> map(Function fn, Higher, IN>, T> ds) {
return narrowK(ds).map(fn);
}
};
}
public static Pure,IN>> unit(Monad monad) {
return new Pure, IN>>() {
@Override
public Higher, IN>, T> unit(T value) {
return Kleisli.of(monad,i->monad.unit(value));
}
};
}
public static Applicative,IN>> applicative(Monad monad) {
return new Applicative, IN>>() {
@Override
public Higher, IN>, R> ap(Higher, IN>, ? extends Function> fn, Higher, IN>, T> apply) {
Kleisli> k = narrowK(fn);
Kleisli ap = narrowK(apply);
return k.flatMapK(fn2-> ap.map(t -> fn2.apply(t)));
}
@Override
public Higher, IN>, T> unit(T value) {
return KleisliInstances.unit(monad).unit(value);
}
@Override
public Higher, IN>, R> map(Function fn, Higher, IN>, T> ds) {
return KleisliInstances.functor().map(fn,ds);
}
};
}
public static Monad,IN>> monad(Monad monad) {
return new Monad, IN>>() {
@Override
public Higher, IN>, R> flatMap(Function, IN>, R>> fn, Higher, IN>, T> ds) {
return narrowK(ds).flatMapK(fn.andThen(Kleisli::narrowK));
}
@Override
public Higher, IN>, R> ap(Higher, IN>, ? extends Function> fn, Higher, IN>, T> apply) {
return KleisliInstances.applicative(monad).ap(fn, apply);
}
@Override
public Higher, IN>, T> unit(T value) {
return KleisliInstances.unit(monad).unit(value);
}
@Override
public Higher, IN>, R> map(Function fn, Higher, IN>, T> ds) {
return KleisliInstances.functor().map(fn, ds);
}
};
}
}