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

net.jqwik.engine.properties.arbitraries.combinations.DefaultCombinator8 Maven / Gradle / Ivy

There is a newer version: 1.9.1
Show newest version
package net.jqwik.engine.properties.arbitraries.combinations;

import java.util.*;
import java.util.function.*;

import net.jqwik.api.*;

import org.jspecify.annotations.*;

public class DefaultCombinator8
	extends DefaultCombinator7
	implements Combinators.Combinator8 {

	protected final Arbitrary a8;

	public DefaultCombinator8(
		Arbitrary a1, Arbitrary a2, Arbitrary a3, Arbitrary a4,
		Arbitrary a5, Arbitrary a6, Arbitrary a7, Arbitrary a8
	) {
		super(a1, a2, a3, a4, a5, a6, a7);
		this.a8 = a8;
	}

	@Override
	public  Arbitrary as(Combinators.F8 combinator) {
		return new CombineArbitrary<>(combineFunction(combinator), a1, a2, a3, a4, a5, a6, a7, a8);
	}

	@Override
	public Combinators.Combinator8 filter(Combinators.F8 filter) {
		return new Filtered<>(a1, a2, a3, a4, a5, a6, a7, a8, filter);
	}

	@SuppressWarnings("unchecked")
	protected  Function, R> combineFunction(Combinators.F8 combinator) {
		return params -> combinator.apply(
			(T1) params.get(0), (T2) params.get(1),
			(T3) params.get(2), (T4) params.get(3),
			(T5) params.get(4), (T6) params.get(5),
			(T7) params.get(6), (T8) params.get(7)
		);
	}

	private static class Filtered extends DefaultCombinator8 {
		private final Combinators.F8 filter;

		private Filtered(
			Arbitrary a1,
			Arbitrary a2,
			Arbitrary a3,
			Arbitrary a4,
			Arbitrary a5,
			Arbitrary a6,
			Arbitrary a7,
			Arbitrary a8,
			Combinators.F8 filter
		) {
			super(a1, a2, a3, a4, a5, a6, a7, a8);
			this.filter = filter;
		}

		@Override
		public  Arbitrary as(Combinators.F8 combinator) {
			return new CombineArbitrary<>(Function.identity(), a1, a2, a3, a4, a5, a6, a7, a8)
					   .filter(combineFunction(filter)::apply)
					   .map(combineFunction(combinator));
		}

		@Override
		public Combinators.Combinator8 filter(Combinators.F8 filter) {
			return super.filter(combineFilters(this.filter, filter));
		}

		private Combinators.F8 combineFilters(
			Combinators.F8 first,
			Combinators.F8 second
		) {
			return (p1, p2, p3, p4, p5, p6, p7, p8) -> first.apply(p1, p2, p3, p4, p5, p6, p7, p8) && second.apply(p1, p2, p3, p4, p5, p6, p7, p8);
		}

	}
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy