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

com.github.tonivade.purefun.instances.IOInstances 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 java.time.Duration;
import com.github.tonivade.purefun.Consumer1;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Kind;
import com.github.tonivade.purefun.Producer;
import com.github.tonivade.purefun.Unit;
import com.github.tonivade.purefun.monad.IO;
import com.github.tonivade.purefun.monad.IOOf;
import com.github.tonivade.purefun.monad.IO_;
import com.github.tonivade.purefun.typeclasses.Bracket;
import com.github.tonivade.purefun.typeclasses.Console;
import com.github.tonivade.purefun.typeclasses.Defer;
import com.github.tonivade.purefun.typeclasses.Functor;
import com.github.tonivade.purefun.typeclasses.Monad;
import com.github.tonivade.purefun.typeclasses.MonadDefer;
import com.github.tonivade.purefun.typeclasses.MonadError;
import com.github.tonivade.purefun.typeclasses.MonadThrow;
import com.github.tonivade.purefun.typeclasses.Reference;
import com.github.tonivade.purefun.typeclasses.Resource;

public interface IOInstances {

  static Functor functor() {
    return IOFunctor.INSTANCE;
  }

  static Monad monad() {
    return IOMonad.INSTANCE;
  }

  static MonadError monadError() {
    return IOMonadError.INSTANCE;
  }

  static MonadThrow monadThrow() {
    return IOMonadThrow.INSTANCE;
  }

  static MonadDefer monadDefer() {
    return IOMonadDefer.INSTANCE;
  }

  static  Reference ref(A value) {
    return Reference.of(monadDefer(), value);
  }
  
  static  Resource resource(IO acquire) {
    return resource(acquire, AutoCloseable::close);
  }
  
  static  Resource resource(IO acquire, Consumer1 release) {
    return Resource.from(monadDefer(), acquire, release);
  }

  static Console console() {
    return ConsoleIO.INSTANCE;
  }
}

interface IOFunctor extends Functor {

  IOFunctor INSTANCE = new IOFunctor() {};

  @Override
  default  Kind map(Kind value, Function1 map) {
    return IOOf.narrowK(value).map(map);
  }
}

interface IOMonad extends Monad {

  IOMonad INSTANCE = new IOMonad() {};

  @Override
  default  IO pure(T value) {
    return IO.pure(value);
  }

  @Override
  default  IO flatMap(Kind value, Function1> map) {
    return IOOf.narrowK(value).flatMap(map.andThen(IOOf::narrowK));
  }
}

interface IOMonadError extends MonadError, IOMonad {

  IOMonadError INSTANCE = new IOMonadError() {};

  @Override
  default  IO raiseError(Throwable error) {
    return IO.raiseError(error);
  }

  @Override
  default  IO handleErrorWith(Kind value, Function1> handler) {
    return IOOf.narrowK(value).redeemWith(handler.andThen(IOOf::narrowK), IO::pure);
  }
}

interface IOMonadThrow extends MonadThrow, IOMonadError {

  IOMonadThrow INSTANCE = new IOMonadThrow() {};
}

interface IODefer extends Defer {

  @Override
  default  IO defer(Producer> defer) {
    return IO.suspend(defer.map(IOOf::narrowK));
  }
}

interface IOBracket extends Bracket {

  @Override
  default  IO bracket(Kind acquire, Function1> use, Consumer1 release) {
    return IO.bracket(IOOf.narrowK(acquire), use.andThen(IOOf::narrowK), release::accept);
  }
}

interface IOMonadDefer extends MonadDefer, IOMonadError, IODefer, IOBracket {

  IOMonadDefer INSTANCE = new IOMonadDefer() {};

  @Override
  default IO sleep(Duration duration) {
    return IO.sleep(duration);
  }
}

final class ConsoleIO implements Console {

  public static final ConsoleIO INSTANCE = new ConsoleIO();

  private final SystemConsole console = new SystemConsole();

  @Override
  public IO readln() {
    return IO.task(console::readln);
  }

  @Override
  public IO println(String text) {
    return IO.exec(() -> console.println(text));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy