com.github.tonivade.purefun.instances.TrampolineInstances Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2020, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun.instances;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Kind;
import com.github.tonivade.purefun.Producer;
import com.github.tonivade.purefun.free.Trampoline;
import com.github.tonivade.purefun.free.TrampolineOf;
import com.github.tonivade.purefun.free.Trampoline_;
import com.github.tonivade.purefun.typeclasses.Applicative;
import com.github.tonivade.purefun.typeclasses.Defer;
import com.github.tonivade.purefun.typeclasses.Functor;
import com.github.tonivade.purefun.typeclasses.Monad;
public interface TrampolineInstances {
static Functor functor() {
return TrampolineFunctor.INSTANCE;
}
static Applicative applicative() {
return TrampolineApplicative.INSTANCE;
}
static Monad monad() {
return TrampolineMonad.INSTANCE;
}
static Defer defer() {
return TrampolineDefer.INSTANCE;
}
}
interface TrampolineFunctor extends Functor {
TrampolineFunctor INSTANCE = new TrampolineFunctor() {};
@Override
default Kind map(Kind value, Function1 mapper) {
return TrampolineOf.narrowK(value).map(mapper);
}
}
interface TrampolinePure extends Applicative {
@Override
default Kind pure(T value) {
return Trampoline.done(value);
}
}
interface TrampolineApplicative extends TrampolinePure {
TrampolineApplicative INSTANCE = new TrampolineApplicative() {};
@Override
default Kind ap(Kind value, Kind> apply) {
return TrampolineOf.narrowK(value).flatMap(t -> TrampolineOf.narrowK(apply).map(f -> f.apply(t)));
}
}
interface TrampolineMonad extends TrampolinePure, Monad {
TrampolineMonad INSTANCE = new TrampolineMonad() {};
@Override
default Kind flatMap(Kind value,
Function1> map) {
return TrampolineOf.narrowK(value).flatMap(map.andThen(TrampolineOf::narrowK));
}
}
interface TrampolineDefer extends Defer {
TrampolineDefer INSTANCE = new TrampolineDefer() {};
@Override
default Kind defer(Producer> defer) {
return Trampoline.more(() -> defer.get().fix(TrampolineOf::narrowK));
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy