com.github.tonivade.purefun.instances.StateInstances Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2022, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun.instances;
import static com.github.tonivade.purefun.Unit.unit;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Kind;
import com.github.tonivade.purefun.Tuple;
import com.github.tonivade.purefun.Unit;
import com.github.tonivade.purefun.data.ImmutableList;
import com.github.tonivade.purefun.monad.State;
import com.github.tonivade.purefun.monad.StateOf;
import com.github.tonivade.purefun.monad.State_;
import com.github.tonivade.purefun.typeclasses.Console;
import com.github.tonivade.purefun.typeclasses.Monad;
import com.github.tonivade.purefun.typeclasses.MonadState;
@SuppressWarnings("unchecked")
public interface StateInstances {
static Monad> monad() {
return StateMonad.INSTANCE;
}
static MonadState, S> monadState() {
return StateMonadState.INSTANCE;
}
static Console>> console() {
return StateConsole.INSTANCE;
}
}
interface StateMonad extends Monad> {
@SuppressWarnings("rawtypes")
StateMonad INSTANCE = new StateMonad() {};
@Override
default State pure(T value) {
return State.pure(value);
}
@Override
default State flatMap(Kind, ? extends T> value,
Function1 super T, ? extends Kind, ? extends R>> map) {
return StateOf.narrowK(value).flatMap(map.andThen(StateOf::narrowK));
}
}
interface StateMonadState extends MonadState, S>, StateMonad {
@SuppressWarnings("rawtypes")
StateMonadState INSTANCE = new StateMonadState() {};
@Override
default State get() {
return State.get();
}
@Override
default State set(S state) {
return State.set(state);
}
}
final class StateConsole implements Console>> {
protected static final StateConsole INSTANCE = new StateConsole();
@Override
public State, String> readln() {
return State.state(list -> Tuple.of(list.tail(), list.head().getOrElseThrow()));
}
@Override
public State, Unit> println(String text) {
return State.state(list -> Tuple.of(list.append(text), unit()));
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy