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

com.github.tonivade.purefun.effect.util.ZRandom Maven / Gradle / Ivy

/*
 * Copyright (c) 2018-2019, Antonio Gabriel Muñoz Conejo 
 * Distributed under the terms of the MIT License
 */
package com.github.tonivade.purefun.effect.util;

import com.github.tonivade.purefun.Nothing;
import com.github.tonivade.purefun.effect.UIO;
import com.github.tonivade.purefun.effect.ZIO;

import java.util.Random;
import java.util.stream.IntStream;

import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;

public interface ZRandom {

   ZRandom.Service random();

  static  ZIO nextInt() {
    return ZIO.accessM(env -> env.random().nextInt());
  }

  static  ZIO nextLong() {
    return ZIO.accessM(env -> env.random().nextLong());
  }

  static  ZIO nextFloat() {
    return ZIO.accessM(env -> env.random().nextFloat());
  }

  static  ZIO nextDouble() {
    return ZIO.accessM(env -> env.random().nextDouble());
  }

  static  ZIO nextChar() {
    return ZIO.accessM(env -> env.random().nextChar());
  }

  static  ZIO nextString(int length) {
    return ZIO.accessM(env -> env.random().nextString(length));
  }

  interface Service {
    ZIO nextInt();
    ZIO nextLong();
    ZIO nextFloat();
    ZIO nextDouble();
    ZIO nextChar();
    ZIO nextString(int length);
  }

  static ZRandom live() {
    return new ZRandomImpl(new Random());
  }

  static ZRandom test(long seed) {
    return new ZRandomImpl(new Random(seed));
  }
}

class ZRandomImpl implements ZRandom {

  private static final String PRINTABLE_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  private Random random;

  ZRandomImpl(Random random) {
    this.random = requireNonNull(random);
  }

  @Override
  public  ZRandom.Service random() {
    return new ZRandom.Service() {

      @Override
      public ZIO nextInt() {
        return UIO.task(random::nextInt).toZIO();
      }

      @Override
      public ZIO nextLong() {
        return UIO.task(random::nextLong).toZIO();
      }

      @Override
      public ZIO nextFloat() {
        return UIO.task(random::nextFloat).toZIO();
      }

      @Override
      public ZIO nextDouble() {
        return UIO.task(random::nextDouble).toZIO();
      }

      @Override
      public ZIO nextChar() {
        return UIO.task(this::randomChar).toZIO();
      }

      @Override
      public ZIO nextString(int length) {
        return UIO.task(() -> randomString(length)).toZIO();
      }

      private Character randomChar() {
        return PRINTABLE_CHARS.charAt(random.nextInt(PRINTABLE_CHARS.length()));
      }

      private String randomString(int length) {
        return IntStream.range(0, length).mapToObj(x -> randomChar()).map(Object::toString).collect(joining());
      }
    };
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy