@Test public void interpretIO() { Kind<IO_, Unit> foldMap = echo.foldMap(IOInstances.monad(), new IOProgramToIO()); ConsoleExecutor executor = new ConsoleExecutor().read("Toni"); executor.run(foldMap.fix(toIO())); assertEquals("what's your name?\nHello Toni\nend\n", executor.getOutput()); }
public <G extends Witness> Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter) { return monad.tailRecM(this, value -> value.step().foldStep(monad, interpreter)); }
Free implements FreeOf<F, A> { public <G extends Witness> Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter) { return monad.tailRecM(this, value -> value.step().foldStep(monad, interpreter)); } }
Free implements FreeOf<F, A> { public <G extends Witness> Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter) { return monad.tailRecM(this, value -> value.step().foldStep(monad, interpreter)); } private  Free(); }
Free implements FreeOf<F, A> { public <G extends Witness> Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter) { return monad.tailRecM(this, value -> value.step().foldStep(monad, interpreter)); } private  Free(); static Free<F, T> pure(T value); static Free<F, T> liftF(Kind<F, ? extends T> value); static Free<G, T> inject(InjectK<F, G> inject, Kind<F, T> value); static Free<F, T> defer(Producer<? extends Free<F, ? extends T>> value); @SuppressWarnings("unchecked") static Monad<Kind<Free_, F>> monadF(); static FunctionK<F, Kind<Free_, G>> functionKF(FunctionK<F, G> functionK); Free<F, R> map(Function1<? super A, ? extends R> map); abstract Free<F, R> flatMap(Function1<? super A, ? extends Free<F, ? extends R>> map); abstract Either<Kind<F, Free<F, A>>, A> resume(Functor<F> functor); abstract Free<F, A> step(); Free<F, R> andThen(Free<F, R> next); Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter); }
Free implements FreeOf<F, A> { public <G extends Witness> Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter) { return monad.tailRecM(this, value -> value.step().foldStep(monad, interpreter)); } private  Free(); static Free<F, T> pure(T value); static Free<F, T> liftF(Kind<F, ? extends T> value); static Free<G, T> inject(InjectK<F, G> inject, Kind<F, T> value); static Free<F, T> defer(Producer<? extends Free<F, ? extends T>> value); @SuppressWarnings("unchecked") static Monad<Kind<Free_, F>> monadF(); static FunctionK<F, Kind<Free_, G>> functionKF(FunctionK<F, G> functionK); Free<F, R> map(Function1<? super A, ? extends R> map); abstract Free<F, R> flatMap(Function1<? super A, ? extends Free<F, ? extends R>> map); abstract Either<Kind<F, Free<F, A>>, A> resume(Functor<F> functor); abstract Free<F, A> step(); Free<F, R> andThen(Free<F, R> next); Kind<G, A> foldMap(Monad<G> monad, FunctionK<F, G> interpreter);  }