// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<Long, Long> appendLuhnCheckDigit() {
//     return new LuhnCheckDigitFunction();
// }
// 
// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<String, String> toLowerCase() {
//     return new ToLowerCaseFunction();
// }
// 
// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<String, String> toUpperCase(@Nonnull Locale locale) {
//     return new ToUpperCaseFunction(checkNotNull(locale));
// }


import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import static com.google.common.base.Preconditions.checkArgument;
import static io.generators.core.MoreFunctions.appendLuhnCheckDigit;
import static io.generators.core.MoreFunctions.toLowerCase;
import static io.generators.core.MoreFunctions.toUpperCase;
import static java.lang.Math.pow;
        return new TypeGenerator<>(type, valueGenerator);
    }

    public static <T> Iterable<T> iterable(int limit, Generator<T> generator) {
        return new GeneratorIterable<>(limit, generator);
    }

    public static <T> Generator<T> biased(int percentageBiasTowardsFirst, Generator<T> firstGenerator, Generator<T> secondGenerator) {
        return new BiasedGenerator<>(percentageBiasTowardsFirst, firstGenerator, secondGenerator);
    }

    public static <T> List<T> listFrom(int limit, Generator<T> generator) {
        return FluentIterable.from(new GeneratorIterable<>(generator)).limit(limit).toList();
    }

    public static <T> Set<T> setFrom(int limit, Generator<T> generator) {
        return FluentIterable.from(new GeneratorIterable<>(generator)).limit(limit).toSet();
    }

    public static <T extends Enum<T>> Generator<T> randomEnum(Class<T> enumClass) {
        return new RandomEnumGenerator<>(enumClass);
    }

    /**
     * Creates Generator that appends Luhn check digit (modulus 10) to the number generated by {@code partialNumberGenerator}
     *
     * @param partialAccountNumberGenerator generator of the main part of the card number
     * @return generator that returns card/account numbers with calculated Luhn check Digit
     */
    public static Generator<Long> cardNumber(Generator<Long> partialAccountNumberGenerator) {
// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<Long, Long> appendLuhnCheckDigit() {
//     return new LuhnCheckDigitFunction();
// }
// 
// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<String, String> toLowerCase() {
//     return new ToLowerCaseFunction();
// }
// 
// Path: generators-core/src/main/java/io/generators/core/MoreFunctions.java
// public static Function<String, String> toUpperCase(@Nonnull Locale locale) {
//     return new ToUpperCaseFunction(checkNotNull(locale));
// }


// Path: generators-core/src/main/java/io/generators/core/Generators.java
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import static com.google.common.base.Preconditions.checkArgument;
import static io.generators.core.MoreFunctions.appendLuhnCheckDigit;
import static io.generators.core.MoreFunctions.toLowerCase;
import static io.generators.core.MoreFunctions.toUpperCase;
import static java.lang.Math.pow;

        return new TypeGenerator<>(type, valueGenerator);
    }

    public static <T> Iterable<T> iterable(int limit, Generator<T> generator) {
        return new GeneratorIterable<>(limit, generator);
    }

    public static <T> Generator<T> biased(int percentageBiasTowardsFirst, Generator<T> firstGenerator, Generator<T> secondGenerator) {
        return new BiasedGenerator<>(percentageBiasTowardsFirst, firstGenerator, secondGenerator);
    }

    public static <T> List<T> listFrom(int limit, Generator<T> generator) {
        return FluentIterable.from(new GeneratorIterable<>(generator)).limit(limit).toList();
    }

    public static <T> Set<T> setFrom(int limit, Generator<T> generator) {
        return FluentIterable.from(new GeneratorIterable<>(generator)).limit(limit).toSet();
    }

    public static <T extends Enum<T>> Generator<T> randomEnum(Class<T> enumClass) {
        return new RandomEnumGenerator<>(enumClass);
    }

    /**
     * Creates Generator that appends Luhn check digit (modulus 10) to the number generated by {@code partialNumberGenerator}
     *
     * @param partialAccountNumberGenerator generator of the main part of the card number
     * @return generator that returns card/account numbers with calculated Luhn check Digit
     */
    public static Generator<Long> cardNumber(Generator<Long> partialAccountNumberGenerator) {
        return new TransformingGenerator<>(partialAccountNumberGenerator, appendLuhnCheckDigit());