// Path: src/main/java/io/smartcat/ranger/distribution/UniformDistribution.java
// public class UniformDistribution implements Distribution {
// 
//     private Random random = new Random();
// 
//     @Override
//     public int nextInt(int bound) {
//         return random.nextInt(bound);
//     }
// 
//     @Override
//     public int nextInt(int lower, int upper) {
//         return random.ints(1, lower, upper).findFirst().getAsInt();
//     }
// 
//     @Override
//     public long nextLong(long bound) {
//         return random.longs(1, 0, bound).findFirst().getAsLong();
//     }
// 
//     @Override
//     public long nextLong(long lower, long upper) {
//         return random.longs(1, lower, upper).findFirst().getAsLong();
//     }
// 
//     @Override
//     public double nextDouble(double lower, double upper) {
//         return random.doubles(1, lower, upper).findFirst().getAsDouble();
//     }
// 
//     @Override
//     public boolean nextBoolean() {
//         return random.nextBoolean();
//     }
// }


import java.time.LocalDateTime;
import java.time.ZoneOffset;
import io.smartcat.ranger.distribution.Distribution;
import io.smartcat.ranger.distribution.UniformDistribution;
package io.smartcat.ranger.core;



/**
 * Randomly generates {@link LocalDateTime} value within specified range.
 */
public class RangeValueLocalDateTime extends Value<LocalDateTime> {

    private final LocalDateTime beginning;
    private final LocalDateTime end;
    private final boolean useEdgeCases;
    private final Distribution distribution;

    private boolean beginningEdgeCaseUsed = false;
    private boolean endEdgeCaseUsed = false;

    /**
     * Constructs range value with specified <code>range</code>. <code>useEdgeCases</code> is set to <code>true</code>
     * and <code>distribution</code> is set to {@link UniformDistribution}.
     *
     * @param beginning The beginning of the range.
     * @param end The end of the range.
     */
    public RangeValueLocalDateTime(LocalDateTime beginning, LocalDateTime end) {
        this(beginning, end, true);
    }

    /**
     * Constructs range value with specified <code>range</code> and <code>useEdgeCases</code>. <code>distribution</code>
     * is set to {@link UniformDistribution}.
     *
     * @param beginning The beginning of the range.
     * @param end The end of the range.
     * @param useEdgeCases Indicates whether to create edge cases as first two values or not.
     */
    public RangeValueLocalDateTime(LocalDateTime beginning, LocalDateTime end, boolean useEdgeCases) {
// Path: src/main/java/io/smartcat/ranger/distribution/UniformDistribution.java
// public class UniformDistribution implements Distribution {
// 
//     private Random random = new Random();
// 
//     @Override
//     public int nextInt(int bound) {
//         return random.nextInt(bound);
//     }
// 
//     @Override
//     public int nextInt(int lower, int upper) {
//         return random.ints(1, lower, upper).findFirst().getAsInt();
//     }
// 
//     @Override
//     public long nextLong(long bound) {
//         return random.longs(1, 0, bound).findFirst().getAsLong();
//     }
// 
//     @Override
//     public long nextLong(long lower, long upper) {
//         return random.longs(1, lower, upper).findFirst().getAsLong();
//     }
// 
//     @Override
//     public double nextDouble(double lower, double upper) {
//         return random.doubles(1, lower, upper).findFirst().getAsDouble();
//     }
// 
//     @Override
//     public boolean nextBoolean() {
//         return random.nextBoolean();
//     }
// }


// Path: src/main/java/io/smartcat/ranger/core/RangeValueLocalDateTime.java
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import io.smartcat.ranger.distribution.Distribution;
import io.smartcat.ranger.distribution.UniformDistribution;

package io.smartcat.ranger.core;



/**
 * Randomly generates {@link LocalDateTime} value within specified range.
 */
public class RangeValueLocalDateTime extends Value<LocalDateTime> {

    private final LocalDateTime beginning;
    private final LocalDateTime end;
    private final boolean useEdgeCases;
    private final Distribution distribution;

    private boolean beginningEdgeCaseUsed = false;
    private boolean endEdgeCaseUsed = false;

    /**
     * Constructs range value with specified <code>range</code>. <code>useEdgeCases</code> is set to <code>true</code>
     * and <code>distribution</code> is set to {@link UniformDistribution}.
     *
     * @param beginning The beginning of the range.
     * @param end The end of the range.
     */
    public RangeValueLocalDateTime(LocalDateTime beginning, LocalDateTime end) {
        this(beginning, end, true);
    }

    /**
     * Constructs range value with specified <code>range</code> and <code>useEdgeCases</code>. <code>distribution</code>
     * is set to {@link UniformDistribution}.
     *
     * @param beginning The beginning of the range.
     * @param end The end of the range.
     * @param useEdgeCases Indicates whether to create edge cases as first two values or not.
     */
    public RangeValueLocalDateTime(LocalDateTime beginning, LocalDateTime end, boolean useEdgeCases) {
        this(beginning, end, useEdgeCases, new UniformDistribution());