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"); } });
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)); }