All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cyclops.instances.arrow.KleisliInstances Maven / Gradle / Ivy

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);
      }
    };


  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy