public static IGen <U> TransformInstances <T, U>(
            this IGen <T> gen,
            GenInstanceTransformation <T, U> transformation) =>
        gen.TransformIterations((IGenIteration <T> iteration) =>
        {
            var either = iteration.ToEither <T, U>();

            if (EitherExtension.IsLeft(either, out IGenInstance <T> instance))
            {
                return(transformation(instance));
            }
            else if (EitherExtension.IsRight(either, out IGenIteration <U> iterationConverted))
            {
                return(iterationConverted);
            }
            else
            {
                throw new Exception("Fatal: Unhandled branch");
            }
        });
Esempio n. 2
0
        internal static IGen <T> SelectError <T>(this IGen <T> gen, Func <IGenErrorData, IGenErrorData> errorSelector)
        {
            IGenIteration <T> SelectError(IGenError <T> error)
            {
                var selectedErrorData = errorSelector(error);

                return(GenIterationFactory.Error <T>(
                           error.ReplayParameters,
                           error.NextParameters,
                           selectedErrorData.GenName,
                           selectedErrorData.Message));
            }

            GenIterationTransformation <T, T> transformation = (iteration) =>
            {
                return(iteration.Match(
                           onError: error => SelectError(error),
                           onInstance: instance => instance,
                           onDiscard: discard => discard));
            };

            return(gen.TransformIterations(transformation));
        }