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