diff --git a/Source/FunicularSwitch.Generators/Generation/GeneralGenerator.cs b/Source/FunicularSwitch.Generators/Generation/GeneralGenerator.cs index 3a7ab984..8926bcc4 100644 --- a/Source/FunicularSwitch.Generators/Generation/GeneralGenerator.cs +++ b/Source/FunicularSwitch.Generators/Generation/GeneralGenerator.cs @@ -49,12 +49,14 @@ private static void WriteMethod(MethodGenerationInfo info, CSharpBuilder cs) private static void WriteMonadInterfaceImplementation(MonadImplementationGenerationInfo data, CSharpBuilder cs) { + var typeParameters = Enumerable.Range(0, data.Monad.ExtraArity).Select(x => $"T{x}").ToList(); + var interfaceA = InterfaceFn("A"); var interfaceB = InterfaceFn("B"); - var typeNameA = data.GenericTypeName(["A"]); - var typeNameB = data.GenericTypeName(["B"]); - var monadTypeNameA = data.Monad.GenericTypeName(["A"]); - var monadTypeNameB = data.Monad.GenericTypeName(["B"]); + var typeNameA = data.GenericTypeName([..typeParameters, "A"]); + var typeNameB = data.GenericTypeName([..typeParameters, "B"]); + var monadTypeNameA = data.Monad.GenericTypeName([..typeParameters, "A"]); + var monadTypeNameB = data.Monad.GenericTypeName([..typeParameters, "B"]); cs.WriteLine($"private readonly record struct {typeNameA}({monadTypeNameA} M) : {interfaceA}"); using var _ = cs.Scope(); @@ -63,9 +65,9 @@ private static void WriteMonadInterfaceImplementation(MonadImplementationGenerat WriteCommonMethodAttributes(cs); cs.WriteLine($"public static implicit operator {monadTypeNameA}({typeNameA} ma) => ma.M;"); WriteCommonMethodAttributes(cs); - cs.WriteLine($"public {interfaceB} Return(B a) => ({typeNameB}){data.Monad.ReturnMethod.Invoke(["B"], ["a"])};"); + cs.WriteLine($"public {interfaceB} Return(B a) => ({typeNameB}){data.Monad.ReturnMethod.Invoke([..typeParameters, "B"], ["a"])};"); WriteCommonMethodAttributes(cs); - cs.WriteLine($"public {interfaceB} Bind(global::System.Func fn) => ({typeNameB}){data.Monad.BindMethod.Invoke(["A", "B"], ["M", $"a => ({monadTypeNameB})({typeNameB})fn(a)"])};"); + cs.WriteLine($"public {interfaceB} Bind(global::System.Func fn) => ({typeNameB}){data.Monad.BindMethod.Invoke([..typeParameters, "A", "B"], ["M", $"a => ({monadTypeNameB})({typeNameB})fn(a)"])};"); WriteCommonMethodAttributes(cs); cs.WriteLine("public B Cast() => (B)(object)M;"); diff --git a/Source/FunicularSwitch.Generators/Generation/MonadMethods.cs b/Source/FunicularSwitch.Generators/Generation/MonadMethods.cs index 4a8993fe..d02c77d3 100644 --- a/Source/FunicularSwitch.Generators/Generation/MonadMethods.cs +++ b/Source/FunicularSwitch.Generators/Generation/MonadMethods.cs @@ -51,6 +51,8 @@ public static IReadOnlyList CreateExtendMonadMethods( ..Return(genericTypeName, monad), ..BindMethods(), ..MapMethods(), + ..CombineMethods(), + ..FlattenMethods(), ]; return methodGenerationInfos .Distinct(MethodGenerationInfo.SignatureComparer.Instance) @@ -69,6 +71,12 @@ IEnumerable MapMethods() => ..Map("Map", genericTypeName, monad), ..Map("Select", genericTypeName, monad), ]; + + IEnumerable CombineMethods() => + Combine(genericTypeName, monad, 12); + + IEnumerable FlattenMethods() => + Flatten("Flatten", genericTypeName, monad); } private static IEnumerable AsyncVariants(string parameterName, Func fn) @@ -146,13 +154,73 @@ IEnumerable ForFnType(Func, TypeIn )); } + private static IEnumerable Combine(ConstructType genericTypeName, MonadInfo chainedMonad, int maxCount) + { + var mapMethod = new InvokeMethod((t, p) => $"{p[0]}.Map<{string.Join(", ", t)}>({p[1]})"); + + return Enumerable.Range(2, maxCount - 1) + .SelectMany(ForCount); + + string Tuple(int count) => $"({string.Join(", ", Enumerable.Range(0, count).Select(i => $"S{i}"))})"; + + string CombineArgs(int count) => string.Join(", ", Enumerable.Range(0, count).Select(i => $"s{i}")); + + IEnumerable ForCount(int count) + { + var typeParameters = Enumerable.Range(0, count).Select(x => $"S{x}").ToList(); + yield return Create( + chainedMonad.ExtraArity, + $"({string.Join(", ", typeParameters)})", + genericTypeName, + typeParameters, + t => Enumerable.Range(0, count) + .Select(i => new ParameterGenerationInfo( + genericTypeName([..t, $"S{i}"]), $"s{i}")) + .ToList(), + "Combine", + t => count > 2 + ? CombineTail(t) + : CombineHead(t) + ); + + string CombineHead(IReadOnlyList t) => + chainedMonad.BindMethod.Invoke([..t, "S0", "(S0, S1)"], ["s0", $"v0 => {mapMethod([..t, "S1", "(S0, S1)"], ["s1", "v1 => (v0, v1)"])}"]); + + string CombineTail(IReadOnlyList t) + { + var fromTupleType = Tuple(count - 1); + var toTupleType = Tuple(count); + var lastType = $"S{count - 1}"; + var lastArg = $"s{count - 1}"; + var mapFn = $"last => ({string.Join(", ", Enumerable.Range(1, count - 1).Select(i => $"prev.Item{i}"))}, last)"; + return chainedMonad.BindMethod.Invoke([..t, fromTupleType, toTupleType], [$"Combine({CombineArgs(count - 1)})", $"prev => {mapMethod([..t, lastType, toTupleType], [lastArg, mapFn])}"]); + } + } + } + + private static IEnumerable Flatten(string name, ConstructType genericTypeName, MonadInfo monad) => + AsyncVariants("ma", p => Create( + monad.ExtraArity, + "A", + genericTypeName, + ["A"], + t => + [ + new ParameterGenerationInfo(genericTypeName([..t, genericTypeName([..t, "A"])]), "ma", true), + ], + name, + t => $"{p}.{monad.BindMethod.Name}([{Constants.DebuggerStepThroughAttribute}](a) => a)" + )); + private static IEnumerable Lift(ConstructType genericTypeName, MonadInfo chainedMonad, MonadInfo outerMonad, MonadInfo innerMonad) => - AsyncVariants("ma", p => new( - genericTypeName(["A"]), + AsyncVariants("ma", p => Create( + chainedMonad.ExtraArity, + "A", + genericTypeName, ["A"], - [new ParameterGenerationInfo(outerMonad.GenericTypeName(["A"]), "ma")], + t => [new ParameterGenerationInfo(outerMonad.GenericTypeName([..t.Take(outerMonad.ExtraArity), "A"]), "ma")], "Lift", - $"{outerMonad.BindMethod.Invoke(["A", $"{innerMonad.GenericTypeName(["A"])}"], [p, $"[{Constants.DebuggerStepThroughAttribute}](a) => {chainedMonad.ReturnMethod.Invoke(["A"], ["a"])}"])}" + t => $"{outerMonad.BindMethod.Invoke([..t.Take(outerMonad.ExtraArity), "A", $"{innerMonad.GenericTypeName([..t.Skip(outerMonad.ExtraArity), "A"])}"], [p, $"[{Constants.DebuggerStepThroughAttribute}](a) => {chainedMonad.ReturnMethod.Invoke([..t, "A"], ["a"])}"])}" )); private static IEnumerable Map(string name, ConstructType genericTypeName, MonadInfo monad) => diff --git a/Source/FunicularSwitch.Generators/Transformer/Generator.cs b/Source/FunicularSwitch.Generators/Transformer/Generator.cs index b9f839d0..1024c9dc 100644 --- a/Source/FunicularSwitch.Generators/Transformer/Generator.cs +++ b/Source/FunicularSwitch.Generators/Transformer/Generator.cs @@ -29,10 +29,12 @@ public static (string filename, string source) Emit( private static void WriteGenericMonad(GenericMonadGenerationInfo data, CSharpBuilder cs) { - var nestedTypeName = data.Monad.GenericTypeName([data.TypeParameter]); - var monadInterface = $"global::FunicularSwitch.Transformers.Monad<{data.TypeParameter}>"; - var altTypeParameter = $"{data.TypeParameter}_"; - var monadInterfaceAlt = $"global::FunicularSwitch.Transformers.Monad<{altTypeParameter}>"; + var nestedTypeName = data.Monad.GenericTypeName(data.TypeParameters.Select(TypeInfo.Parameter).ToList()); + var extraTypeParametersString = string.Concat(data.TypeParameters.Take(data.TypeParameters.Count - 1).Select(x => $"{x}, ")); + var valueTypeParameter = data.TypeParameters.Last(); + var monadInterface = $"global::FunicularSwitch.Transformers.Monad<{valueTypeParameter}>"; + var altValueTypeParameter = $"{data.TypeParameters.Last()}_"; + var monadInterfaceAlt = $"global::FunicularSwitch.Transformers.Monad<{altValueTypeParameter}>"; using var _ = new Scope(cs, $"{Types.DetermineAccessModifier(data.Accessibility)} {data.Modifier} {data.TypeNameWithTypeParameters}({nestedTypeName} M) : {monadInterface}"); if (!data.IsRecord) @@ -45,10 +47,10 @@ private static void WriteGenericMonad(GenericMonadGenerationInfo data, CSharpBui GeneralGenerator.WriteCommonMethodAttributes(cs); cs.WriteLine($"public static implicit operator {nestedTypeName}({data.TypeNameWithTypeParameters} ma) => ma.M;"); GeneralGenerator.WriteCommonMethodAttributes(cs); - cs.WriteLine($"{monadInterfaceAlt} {monadInterface}.Return<{altTypeParameter}>({altTypeParameter} a) => {data.TypeName}.{data.Monad.ReturnMethod.Name}(a);"); + cs.WriteLine($"{monadInterfaceAlt} {monadInterface}.Return<{altValueTypeParameter}>({altValueTypeParameter} a) => {data.TypeName}.{data.Monad.ReturnMethod.Name}<{extraTypeParametersString}{altValueTypeParameter}>(a);"); GeneralGenerator.WriteCommonMethodAttributes(cs); - cs.WriteLine($"{monadInterfaceAlt} {monadInterface}.Bind<{altTypeParameter}>(global::System.Func<{data.TypeParameter}, {monadInterfaceAlt}> fn) => this.{data.Monad.BindMethod.Name}(a => ({data.TypeName}<{altTypeParameter}>)fn(a));"); + cs.WriteLine($"{monadInterfaceAlt} {monadInterface}.Bind<{altValueTypeParameter}>(global::System.Func<{valueTypeParameter}, {monadInterfaceAlt}> fn) => this.{data.Monad.BindMethod.Name}(a => ({data.TypeName}<{extraTypeParametersString}{altValueTypeParameter}>)fn(a));"); GeneralGenerator.WriteCommonMethodAttributes(cs); - cs.WriteLine($"{altTypeParameter} {monadInterface}.Cast<{altTypeParameter}>() => ({altTypeParameter})(object)M;"); + cs.WriteLine($"{altValueTypeParameter} {monadInterface}.Cast<{altValueTypeParameter}>() => ({altValueTypeParameter})(object)M;"); } } diff --git a/Source/FunicularSwitch.Generators/Transformer/GenericMonadGenerationInfo.cs b/Source/FunicularSwitch.Generators/Transformer/GenericMonadGenerationInfo.cs index 51e31253..6d02581e 100644 --- a/Source/FunicularSwitch.Generators/Transformer/GenericMonadGenerationInfo.cs +++ b/Source/FunicularSwitch.Generators/Transformer/GenericMonadGenerationInfo.cs @@ -6,7 +6,7 @@ internal record GenericMonadGenerationInfo( Accessibility Accessibility, string Modifier, string TypeName, - string TypeParameter, + IReadOnlyList TypeParameters, string TypeNameWithTypeParameters, bool IsRecord, MonadInfo Monad); diff --git a/Source/FunicularSwitch.Generators/Transformer/Parser.cs b/Source/FunicularSwitch.Generators/Transformer/Parser.cs index a1de1afa..42f2a1c1 100644 --- a/Source/FunicularSwitch.Generators/Transformer/Parser.cs +++ b/Source/FunicularSwitch.Generators/Transformer/Parser.cs @@ -56,26 +56,36 @@ from chainedMonads in transformerTypes )) select transformMonadData; - static ConstructType ChainGenericTypeName(ConstructType outer, ConstructType inner) => - x => outer([inner(x)]); + static ConstructType ChainGenericTypeName(MonadInfo outer, MonadInfo inner) => + x => outer.GenericTypeName( + [..x.Take(outer.ExtraArity), inner.GenericTypeName([..x.Skip(outer.ExtraArity)])]); - static MethodInfo CombineReturn(MethodInfo outer, MonadInfo inner) => + static MethodInfo CombineReturn(MonadInfo outer, MonadInfo inner) => new MethodInfo( - DetermineMethodName(outer.Name, inner.ReturnMethod.Name, "Return"), - (t, p) => $"{outer.Invoke([inner.GenericTypeName([t[0]])], [inner.ReturnMethod.Invoke(t, p)])}"); + DetermineMethodName(outer.ReturnMethod.Name, inner.ReturnMethod.Name, "Return"), + (t, p) => + $"{outer.ReturnMethod.Invoke([..t.Take(outer.ExtraArity), inner.GenericTypeName([..t.Skip(outer.ExtraArity)])], [inner.ReturnMethod.Invoke([..t.Skip(outer.ExtraArity)], p)])}"); static MethodInfo TransformBind(MonadInfo outer, MonadInfo inner, string transformerTypeName, ConstructType outerInterfaceImplName) { - var chainedGenericType = ChainGenericTypeName(outer.GenericTypeName, inner.GenericTypeName); + var chainedGenericType = ChainGenericTypeName(outer, inner); return new MethodInfo( DetermineMethodName(outer.BindMethod.Name, inner.BindMethod.Name, "Bind"), (t, p) => { - var ma = $"({outerInterfaceImplName([inner.GenericTypeName([t[0]])])}){p[0]}"; - var fn = $"[{Constants.DebuggerStepThroughAttribute}](a) => ({outerInterfaceImplName([inner.GenericTypeName([t[1]])])})(new global::System.Func<{t[0]}, {chainedGenericType([t[1]])}>({p[1]}).Invoke(a))"; // A -> Monad> - - var call = $"{transformerTypeName}.BindT<{t[0]}, {t[1]}>({ma}, {fn}).Cast<{chainedGenericType([t[1]])}>()"; + var extraTypeArgs = t.Take(outer.ExtraArity + inner.ExtraArity).ToList(); + var fromType = t.Skip(outer.ExtraArity + inner.ExtraArity).First(); + var toType = t.Last(); + var fromInterfaceType = outerInterfaceImplName([..t.Take(outer.ExtraArity), inner.GenericTypeName([..t.Skip(outer.ExtraArity).Take(inner.ExtraArity), fromType])]); + var fromNestedType = outer.GenericTypeName([ + ..extraTypeArgs.Take(outer.ExtraArity), + inner.GenericTypeName([..extraTypeArgs.Skip(outer.ExtraArity), fromType]), + ]); + var ma = $"({fromInterfaceType})({fromNestedType}){p[0]}"; + var fn = $"[{Constants.DebuggerStepThroughAttribute}](a) => ({outerInterfaceImplName([..t.Take(outer.ExtraArity), inner.GenericTypeName([..t.Skip(outer.ExtraArity).Take(inner.ExtraArity), toType])])})(new global::System.Func<{fromType}, {chainedGenericType([..t.Take(outer.ExtraArity + inner.ExtraArity), toType])}>({p[1]}).Invoke(a))"; // A -> Monad> + + var call = $"{transformerTypeName}.BindT<{string.Join(", ", t.Skip(outer.ExtraArity))}>({ma}, {fn}).Cast<{chainedGenericType([..t.Take(outer.ExtraArity + inner.ExtraArity), toType])}>()"; return call; }); } @@ -92,9 +102,9 @@ static GenerationResult TransformMonad(MonadInfo outer, INamedTypeSym outerInterfaceImplementation?.GenericTypeName ?? outer.GenericTypeName; var transformedMonad = new MonadInfo( - ChainGenericTypeName(outer.GenericTypeName, innerMonad.GenericTypeName), + ChainGenericTypeName(outer, innerMonad), outer.ExtraArity + innerMonad.ExtraArity, - CombineReturn(outer.ReturnMethod, innerMonad), + CombineReturn(outer, innerMonad), TransformBind(outer, innerMonad, transformerTypeName, outerInterfaceName)); return transformedMonad; }); @@ -106,14 +116,14 @@ private static GenericMonadGenerationInfo BuildGenericMonad( { var typeModifier = DetermineTypeModifier(transformedMonadSymbol); var isRecord = transformedMonadSymbol.IsRecord; - var typeParameter = transformedMonadSymbol.TypeArguments[0].Name; + var typeParameters = transformedMonadSymbol.TypeArguments.Select(x => x.Name).ToList(); return new( transformedMonadSymbol.GetActualAccessibility(), typeModifier, transformedMonadSymbol.Name, - typeParameter, - $"{transformedMonadSymbol.Name}<{typeParameter}>", + typeParameters, + $"{transformedMonadSymbol.Name}<{string.Join(", ", typeParameters)}>", isRecord, chainedMonad ); diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Either.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Either.g.cs new file mode 100644 index 00000000..38c09033 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Either.g.cs @@ -0,0 +1,95 @@ +namespace FunicularSwitch.Generators.Consumer +{ + public static partial class Either + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Right(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Generators.Consumer.Either.Right((await a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Right(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Either.Right((await a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Either.Bind(((global::FunicularSwitch.Generators.Consumer.Either)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Either.Bind(((global::FunicularSwitch.Generators.Consumer.Either)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either SelectMany(this global::FunicularSwitch.Generators.Consumer.Either ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Either.Bind(((global::FunicularSwitch.Generators.Consumer.Either)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Either.Bind(((global::FunicularSwitch.Generators.Consumer.Either)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Either.Bind(((global::FunicularSwitch.Generators.Consumer.Either)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either SelectMany(this global::FunicularSwitch.Generators.Consumer.Either ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Either)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Either)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Either)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Map(this global::FunicularSwitch.Generators.Consumer.Either ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Select(this global::FunicularSwitch.Generators.Consumer.Either ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1) => global::FunicularSwitch.Generators.Consumer.Either.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6, global::FunicularSwitch.Generators.Consumer.Either s7) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6, global::FunicularSwitch.Generators.Consumer.Either s7, global::FunicularSwitch.Generators.Consumer.Either s8) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6, global::FunicularSwitch.Generators.Consumer.Either s7, global::FunicularSwitch.Generators.Consumer.Either s8, global::FunicularSwitch.Generators.Consumer.Either s9) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6, global::FunicularSwitch.Generators.Consumer.Either s7, global::FunicularSwitch.Generators.Consumer.Either s8, global::FunicularSwitch.Generators.Consumer.Either s9, global::FunicularSwitch.Generators.Consumer.Either s10) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Combine(global::FunicularSwitch.Generators.Consumer.Either s0, global::FunicularSwitch.Generators.Consumer.Either s1, global::FunicularSwitch.Generators.Consumer.Either s2, global::FunicularSwitch.Generators.Consumer.Either s3, global::FunicularSwitch.Generators.Consumer.Either s4, global::FunicularSwitch.Generators.Consumer.Either s5, global::FunicularSwitch.Generators.Consumer.Either s6, global::FunicularSwitch.Generators.Consumer.Either s7, global::FunicularSwitch.Generators.Consumer.Either s8, global::FunicularSwitch.Generators.Consumer.Either s9, global::FunicularSwitch.Generators.Consumer.Either s10, global::FunicularSwitch.Generators.Consumer.Either s11) => global::FunicularSwitch.Generators.Consumer.Either.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Either Flatten(this global::FunicularSwitch.Generators.Consumer.Either> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer.g.cs index 6a8dcc8a..a5bc2b7b 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer.g.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer.g.cs @@ -49,5 +49,47 @@ public static partial class Writer [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6, global::FunicularSwitch.Generators.Consumer.Writer s7) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6, global::FunicularSwitch.Generators.Consumer.Writer s7, global::FunicularSwitch.Generators.Consumer.Writer s8) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6, global::FunicularSwitch.Generators.Consumer.Writer s7, global::FunicularSwitch.Generators.Consumer.Writer s8, global::FunicularSwitch.Generators.Consumer.Writer s9) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6, global::FunicularSwitch.Generators.Consumer.Writer s7, global::FunicularSwitch.Generators.Consumer.Writer s8, global::FunicularSwitch.Generators.Consumer.Writer s9, global::FunicularSwitch.Generators.Consumer.Writer s10) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Generators.Consumer.Writer s0, global::FunicularSwitch.Generators.Consumer.Writer s1, global::FunicularSwitch.Generators.Consumer.Writer s2, global::FunicularSwitch.Generators.Consumer.Writer s3, global::FunicularSwitch.Generators.Consumer.Writer s4, global::FunicularSwitch.Generators.Consumer.Writer s5, global::FunicularSwitch.Generators.Consumer.Writer s6, global::FunicularSwitch.Generators.Consumer.Writer s7, global::FunicularSwitch.Generators.Consumer.Writer s8, global::FunicularSwitch.Generators.Consumer.Writer s9, global::FunicularSwitch.Generators.Consumer.Writer s10, global::FunicularSwitch.Generators.Consumer.Writer s11) => global::FunicularSwitch.Generators.Consumer.Writer.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer Flatten(this global::FunicularSwitch.Generators.Consumer.Writer> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer2.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer2.g.cs new file mode 100644 index 00000000..161fee74 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.ExtendMonadGenerator/FunicularSwitch.Generators.Consumer.Writer2.g.cs @@ -0,0 +1,95 @@ +namespace FunicularSwitch.Generators.Consumer +{ + public static partial class Writer2 + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Init(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init((await a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Init(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init((await a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(((global::FunicularSwitch.Generators.Consumer.Writer2)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(((global::FunicularSwitch.Generators.Consumer.Writer2)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer2 ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(((global::FunicularSwitch.Generators.Consumer.Writer2)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(((global::FunicularSwitch.Generators.Consumer.Writer2)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(((global::FunicularSwitch.Generators.Consumer.Writer2)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer2 ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Map(this global::FunicularSwitch.Generators.Consumer.Writer2 ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Select(this global::FunicularSwitch.Generators.Consumer.Writer2 ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6, global::FunicularSwitch.Generators.Consumer.Writer2 s7) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6, global::FunicularSwitch.Generators.Consumer.Writer2 s7, global::FunicularSwitch.Generators.Consumer.Writer2 s8) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6, global::FunicularSwitch.Generators.Consumer.Writer2 s7, global::FunicularSwitch.Generators.Consumer.Writer2 s8, global::FunicularSwitch.Generators.Consumer.Writer2 s9) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6, global::FunicularSwitch.Generators.Consumer.Writer2 s7, global::FunicularSwitch.Generators.Consumer.Writer2 s8, global::FunicularSwitch.Generators.Consumer.Writer2 s9, global::FunicularSwitch.Generators.Consumer.Writer2 s10) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Combine(global::FunicularSwitch.Generators.Consumer.Writer2 s0, global::FunicularSwitch.Generators.Consumer.Writer2 s1, global::FunicularSwitch.Generators.Consumer.Writer2 s2, global::FunicularSwitch.Generators.Consumer.Writer2 s3, global::FunicularSwitch.Generators.Consumer.Writer2 s4, global::FunicularSwitch.Generators.Consumer.Writer2 s5, global::FunicularSwitch.Generators.Consumer.Writer2 s6, global::FunicularSwitch.Generators.Consumer.Writer2 s7, global::FunicularSwitch.Generators.Consumer.Writer2 s8, global::FunicularSwitch.Generators.Consumer.Writer2 s9, global::FunicularSwitch.Generators.Consumer.Writer2 s10, global::FunicularSwitch.Generators.Consumer.Writer2 s11) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2 Flatten(this global::FunicularSwitch.Generators.Consumer.Writer2> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.OptionResult.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.OptionResult.g.cs index a77445b5..2c9a5779 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.OptionResult.g.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.OptionResult.g.cs @@ -7,7 +7,7 @@ public partial record OptionResult(global::FunicularSwitch.Option>(OptionResult ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => OptionResult.SomeOk(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => OptionResult.SomeOk(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (OptionResult)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -49,40 +49,40 @@ private readonly record struct Impl__FunicularSwitch_Option(global::Funicular public static async global::System.Threading.Tasks.ValueTask> SomeOk(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Option>.Some(global::FunicularSwitch.Result.Ok((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.OptionResult Bind(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.OptionResult Bind(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.OptionResult Bind(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.OptionResult Bind(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.OptionResult SelectMany(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.OptionResult SelectMany(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.OptionResult SelectMany(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.OptionResult SelectMany(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)((global::FunicularSwitch.Option>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Generators.Consumer.OptionResult SelectMany(this global::FunicularSwitch.Generators.Consumer.OptionResult ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.OptionResult)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -119,5 +119,47 @@ private readonly record struct Impl__FunicularSwitch_Option(global::Funicular [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Option>.Some(global::FunicularSwitch.Result.Ok(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Option>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Option>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Option>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Option>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Option>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6, global::FunicularSwitch.Generators.Consumer.OptionResult s7) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Option>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6, global::FunicularSwitch.Generators.Consumer.OptionResult s7, global::FunicularSwitch.Generators.Consumer.OptionResult s8) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Option>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6, global::FunicularSwitch.Generators.Consumer.OptionResult s7, global::FunicularSwitch.Generators.Consumer.OptionResult s8, global::FunicularSwitch.Generators.Consumer.OptionResult s9) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Option>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6, global::FunicularSwitch.Generators.Consumer.OptionResult s7, global::FunicularSwitch.Generators.Consumer.OptionResult s8, global::FunicularSwitch.Generators.Consumer.OptionResult s9, global::FunicularSwitch.Generators.Consumer.OptionResult s10) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Option>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Generators.Consumer.OptionResult s0, global::FunicularSwitch.Generators.Consumer.OptionResult s1, global::FunicularSwitch.Generators.Consumer.OptionResult s2, global::FunicularSwitch.Generators.Consumer.OptionResult s3, global::FunicularSwitch.Generators.Consumer.OptionResult s4, global::FunicularSwitch.Generators.Consumer.OptionResult s5, global::FunicularSwitch.Generators.Consumer.OptionResult s6, global::FunicularSwitch.Generators.Consumer.OptionResult s7, global::FunicularSwitch.Generators.Consumer.OptionResult s8, global::FunicularSwitch.Generators.Consumer.OptionResult s9, global::FunicularSwitch.Generators.Consumer.OptionResult s10, global::FunicularSwitch.Generators.Consumer.OptionResult s11) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Option>)(global::FunicularSwitch.Option>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Option>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Option>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.OptionResult Flatten(this global::FunicularSwitch.Generators.Consumer.OptionResult> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultEnumerable.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultEnumerable.g.cs index 171039f8..d53dfedc 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultEnumerable.g.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultEnumerable.g.cs @@ -7,7 +7,7 @@ public readonly partial record struct ResultEnumerable(global::FunicularSwitc [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Generators.Consumer.Result>(ResultEnumerable ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => ResultEnumerable.OkYield(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => ResultEnumerable.OkYield(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (ResultEnumerable)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -49,40 +49,40 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Result< public static async global::System.Threading.Tasks.ValueTask> OkYield(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Result>.Ok(global::FunicularSwitch.Transformers.EnumerableT.Yield((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable Bind(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable Bind(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable Bind(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable Bind(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.ResultEnumerable)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -119,5 +119,47 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Result< [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Result>.Ok(global::FunicularSwitch.Transformers.EnumerableT.Yield(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1) => global::FunicularSwitch.Transformers.EnumerableT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s7) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s7, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s8) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s7, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s8, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s9) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s7, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s8, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s9, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s10) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Generators.Consumer.ResultEnumerable s0, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s1, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s2, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s3, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s4, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s5, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s6, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s7, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s8, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s9, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s10, global::FunicularSwitch.Generators.Consumer.ResultEnumerable s11) => global::FunicularSwitch.Transformers.EnumerableT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultEnumerable Flatten(this global::FunicularSwitch.Generators.Consumer.ResultEnumerable> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultOption.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultOption.g.cs index 96dc4c3c..79fb070f 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultOption.g.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.ResultOption.g.cs @@ -7,7 +7,7 @@ public partial record ResultOption(global::FunicularSwitch.Generators.Consume [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Generators.Consumer.Result>(ResultOption ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => ResultOption.OkSome(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => ResultOption.OkSome(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (ResultOption)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -49,40 +49,40 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Result< public static async global::System.Threading.Tasks.ValueTask> OkSome(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Result>.Ok(global::FunicularSwitch.Option.Some((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultOption Bind(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultOption Bind(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultOption Bind(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultOption Bind(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultOption SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultOption SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.ResultOption SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.ResultOption SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)((global::FunicularSwitch.Generators.Consumer.Result>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Generators.Consumer.ResultOption SelectMany(this global::FunicularSwitch.Generators.Consumer.ResultOption ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.ResultOption)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -119,5 +119,47 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Result< [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Result>.Ok(global::FunicularSwitch.Option.Some(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1) => global::FunicularSwitch.Transformers.OptionT.BindT((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6, global::FunicularSwitch.Generators.Consumer.ResultOption s7) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6, global::FunicularSwitch.Generators.Consumer.ResultOption s7, global::FunicularSwitch.Generators.Consumer.ResultOption s8) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6, global::FunicularSwitch.Generators.Consumer.ResultOption s7, global::FunicularSwitch.Generators.Consumer.ResultOption s8, global::FunicularSwitch.Generators.Consumer.ResultOption s9) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6, global::FunicularSwitch.Generators.Consumer.ResultOption s7, global::FunicularSwitch.Generators.Consumer.ResultOption s8, global::FunicularSwitch.Generators.Consumer.ResultOption s9, global::FunicularSwitch.Generators.Consumer.ResultOption s10) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Generators.Consumer.ResultOption s0, global::FunicularSwitch.Generators.Consumer.ResultOption s1, global::FunicularSwitch.Generators.Consumer.ResultOption s2, global::FunicularSwitch.Generators.Consumer.ResultOption s3, global::FunicularSwitch.Generators.Consumer.ResultOption s4, global::FunicularSwitch.Generators.Consumer.ResultOption s5, global::FunicularSwitch.Generators.Consumer.ResultOption s6, global::FunicularSwitch.Generators.Consumer.ResultOption s7, global::FunicularSwitch.Generators.Consumer.ResultOption s8, global::FunicularSwitch.Generators.Consumer.ResultOption s9, global::FunicularSwitch.Generators.Consumer.ResultOption s10, global::FunicularSwitch.Generators.Consumer.ResultOption s11) => global::FunicularSwitch.Transformers.OptionT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Generators_Consumer_Result>)(global::FunicularSwitch.Generators.Consumer.Result>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Result>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Generators.Consumer.Result>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.ResultOption Flatten(this global::FunicularSwitch.Generators.Consumer.ResultOption> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterEither.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterEither.g.cs new file mode 100644 index 00000000..87071015 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterEither.g.cs @@ -0,0 +1,124 @@ +namespace FunicularSwitch.Generators.Consumer +{ + public static partial class WriterEither + { + private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Writer2(global::FunicularSwitch.Generators.Consumer.Writer2 M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Generators_Consumer_Writer2(global::FunicularSwitch.Generators.Consumer.Writer2 ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Generators.Consumer.Writer2(Impl__FunicularSwitch_Generators_Consumer_Writer2 ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2)global::FunicularSwitch.Generators.Consumer.Writer2.Init(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Generators_Consumer_Writer2)global::FunicularSwitch.Generators.Consumer.Writer2.Bind(M, a => (global::FunicularSwitch.Generators.Consumer.Writer2)(Impl__FunicularSwitch_Generators_Consumer_Writer2)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Lift(global::FunicularSwitch.Generators.Consumer.Writer2 ma) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Generators.Consumer.Writer2.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> InitRight(A a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> InitRight(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> InitRight(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Bind(this global::FunicularSwitch.Generators.Consumer.Writer2> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer2> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)((global::FunicularSwitch.Generators.Consumer.Writer2>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer2> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer2>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Map(this global::FunicularSwitch.Generators.Consumer.Writer2> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Select(this global::FunicularSwitch.Generators.Consumer.Writer2> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer2.Init>(global::FunicularSwitch.Generators.Consumer.Either.Right(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6, global::FunicularSwitch.Generators.Consumer.Writer2> s7) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6, global::FunicularSwitch.Generators.Consumer.Writer2> s7, global::FunicularSwitch.Generators.Consumer.Writer2> s8) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6, global::FunicularSwitch.Generators.Consumer.Writer2> s7, global::FunicularSwitch.Generators.Consumer.Writer2> s8, global::FunicularSwitch.Generators.Consumer.Writer2> s9) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6, global::FunicularSwitch.Generators.Consumer.Writer2> s7, global::FunicularSwitch.Generators.Consumer.Writer2> s8, global::FunicularSwitch.Generators.Consumer.Writer2> s9, global::FunicularSwitch.Generators.Consumer.Writer2> s10) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Combine(global::FunicularSwitch.Generators.Consumer.Writer2> s0, global::FunicularSwitch.Generators.Consumer.Writer2> s1, global::FunicularSwitch.Generators.Consumer.Writer2> s2, global::FunicularSwitch.Generators.Consumer.Writer2> s3, global::FunicularSwitch.Generators.Consumer.Writer2> s4, global::FunicularSwitch.Generators.Consumer.Writer2> s5, global::FunicularSwitch.Generators.Consumer.Writer2> s6, global::FunicularSwitch.Generators.Consumer.Writer2> s7, global::FunicularSwitch.Generators.Consumer.Writer2> s8, global::FunicularSwitch.Generators.Consumer.Writer2> s9, global::FunicularSwitch.Generators.Consumer.Writer2> s10, global::FunicularSwitch.Generators.Consumer.Writer2> s11) => global::FunicularSwitch.Generators.Consumer.Either.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer2>)(global::FunicularSwitch.Generators.Consumer.Writer2>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer2>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Generators.Consumer.Writer2>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer2> Flatten(this global::FunicularSwitch.Generators.Consumer.Writer2>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterResult.g.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterResult.g.cs index 9f17847e..744bb831 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterResult.g.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/Generated/FunicularSwitch.Generators/FunicularSwitch.Generators.TransformerGenerator/FunicularSwitch.Generators.Consumer.WriterResult.g.cs @@ -35,22 +35,22 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Writer< public static async global::System.Threading.Tasks.ValueTask>> InitOk(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Generators.Consumer.Writer.Init>(global::FunicularSwitch.Result.Ok((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.Writer> Bind(this global::FunicularSwitch.Generators.Consumer.Writer> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.Writer> Bind(this global::FunicularSwitch.Generators.Consumer.Writer> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Generators.Consumer.Writer> SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Generators.Consumer.Writer> SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)((global::FunicularSwitch.Generators.Consumer.Writer>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Generators.Consumer.Writer> SelectMany(this global::FunicularSwitch.Generators.Consumer.Writer> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Generators.Consumer.Writer>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -78,5 +78,47 @@ private readonly record struct Impl__FunicularSwitch_Generators_Consumer_Writer< [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Generators.Consumer.Writer.Init>(global::FunicularSwitch.Result.Ok(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1) => global::FunicularSwitch.Transformers.ResultT.BindT((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6, global::FunicularSwitch.Generators.Consumer.Writer> s7) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6, global::FunicularSwitch.Generators.Consumer.Writer> s7, global::FunicularSwitch.Generators.Consumer.Writer> s8) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6, global::FunicularSwitch.Generators.Consumer.Writer> s7, global::FunicularSwitch.Generators.Consumer.Writer> s8, global::FunicularSwitch.Generators.Consumer.Writer> s9) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6, global::FunicularSwitch.Generators.Consumer.Writer> s7, global::FunicularSwitch.Generators.Consumer.Writer> s8, global::FunicularSwitch.Generators.Consumer.Writer> s9, global::FunicularSwitch.Generators.Consumer.Writer> s10) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Combine(global::FunicularSwitch.Generators.Consumer.Writer> s0, global::FunicularSwitch.Generators.Consumer.Writer> s1, global::FunicularSwitch.Generators.Consumer.Writer> s2, global::FunicularSwitch.Generators.Consumer.Writer> s3, global::FunicularSwitch.Generators.Consumer.Writer> s4, global::FunicularSwitch.Generators.Consumer.Writer> s5, global::FunicularSwitch.Generators.Consumer.Writer> s6, global::FunicularSwitch.Generators.Consumer.Writer> s7, global::FunicularSwitch.Generators.Consumer.Writer> s8, global::FunicularSwitch.Generators.Consumer.Writer> s9, global::FunicularSwitch.Generators.Consumer.Writer> s10, global::FunicularSwitch.Generators.Consumer.Writer> s11) => global::FunicularSwitch.Transformers.ResultT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Generators_Consumer_Writer>)(global::FunicularSwitch.Generators.Consumer.Writer>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Generators_Consumer_Writer>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Generators.Consumer.Writer>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Generators.Consumer.Writer> Flatten(this global::FunicularSwitch.Generators.Consumer.Writer>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Consumer/TransformerSpecs.cs b/Source/Tests/FunicularSwitch.Generators.Consumer/TransformerSpecs.cs index 70724865..71bf425d 100644 --- a/Source/Tests/FunicularSwitch.Generators.Consumer/TransformerSpecs.cs +++ b/Source/Tests/FunicularSwitch.Generators.Consumer/TransformerSpecs.cs @@ -102,6 +102,82 @@ public void ResultOption_Return() result.Should().BeEquivalentTo(expected); } + [TestMethod] + [DataRow(2, 2, "Right 4", "")] + [DataRow(0, 2, "Right 2", "value == 0")] + [DataRow(2, 0, "Right 2", "value == 0")] + [DataRow(2, -1, "Left value < 0", "value < 0")] + [DataRow(-1, 2, "Left value < 0", "value < 0")] + [DataRow(0, -1, "Left value < 0", """ + value == 0 + value < 0 + """)] + [DataRow(-1, 0, "Left value < 0", "value < 0")] + public void WriterEither_Combine(int a, int b, string expectedResult, string expectedLog) + { + // Act + var result = + from t in WriterEither.Combine(From(a), From(b)) + let c = t.Item1 + t.Item2 + select c; + + // Assert + using (new AssertionScope()) + { + string.Join(Environment.NewLine, result.Log).Should().Be(expectedLog); + ((string) result.Value.ToString()).Should().Be(expectedResult); + } + + Writer2> From(int value) => value switch + { + < 0 => WriterEither.Left("value < 0"), + 0 => WriterEither.Append(value, "value == 0"), + _ => WriterEither.InitRight(value), + }; + } + + [TestMethod] + [DataRow(1, 1, "Right 0", """ + 1/1 = 1 + 1-1 = 0 + sqrt(0) = 0 + """)] + [DataRow(2, 2, "Left sqrt(-1) -> Cannot get square root of negative number", """ + 2/2 = 1 + 1-2 = -1 + sqrt(-1) -> Cannot get square root of negative number + """)] + [DataRow(2, 0, "Left 2/0 -> Cannot divide by 0", "2/0 -> Cannot divide by 0")] + public void WriterEither_UseCase(int a, int b, string expectedResult, string expectedLog) + { + // Act + var result = + from x in Div(a, b) + from y in Subtract(x, b) + from z in Sqrt(y) + select y; + + // Assert + using (new AssertionScope()) + { + string.Join(Environment.NewLine, result.Log).Should().Be(expectedLog); + ((string) result.Value.ToString()).Should().Be(expectedResult); + } + + static Writer2> Sqrt(int a) => + a < 0 + ? WriterEither.Left($"sqrt({a}) -> Cannot get square root of negative number") + : WriterEither.Append((int) Math.Sqrt(a), v => $"sqrt({a}) = {v}"); + + static Writer2> Div(int a, int b) => + b == 0 + ? WriterEither.Left($"{a}/{b} -> Cannot divide by 0") + : WriterEither.Append(a / b, v => $"{a}/{b} = {v}"); + + static Writer2> Subtract(int a, int b) => + WriterEither.Append(a - b, v => $"{a}-{b} = {v}"); + } + [TestMethod] [DataRow(1, 1, "Ok 0", """ 1/1 = 1 @@ -196,3 +272,69 @@ public static ResultEnumerable Assert(this ResultEnumerable ma, Func Where(this ResultEnumerable ma, Func predicate) => ma.Bind(a => predicate(a) ? OkYield(a) : Empty()); } + +public record Writer2(A Value, IReadOnlyList Log); + +[ExtendMonad] +public static partial class Writer2 +{ + public static Writer2 Append(A v, L log) => new(v, [log]); + + public static Writer2 Bind(this Writer2 ma, Func> fn) + { + var tmp = fn(ma.Value); + var result = tmp with {Log = [..ma.Log, ..tmp.Log]}; + return result; + } + + public static Writer2 Init(A v) => new(v, []); +} + +public abstract record Either +{ + public record Left(B Value) : Either + { + public override string ToString() => $"Left {Value}"; + } + + public record Right(A Value) : Either + { + public override string ToString() => $"Right {Value}"; + } +} + +[ExtendMonad] +[MonadTransformer(typeof(Either))] +public static partial class Either +{ + public static Either Bind(this Either ma, Func> fn) => ma switch + { + Either.Left left => Left(left.Value), + Either.Right right => fn(right.Value), + _ => throw new ArgumentOutOfRangeException(), + }; + + public static Monad> BindT(Monad> ma, Func>> fn) => + ma.Bind(eitherA => eitherA switch + { + Either.Left left => ma.Return(Left(left.Value)), + Either.Right right => fn(right.Value), + _ => throw new ArgumentOutOfRangeException(), + }); + + public static Either Left(B b) => new Either.Left(b); + + public static Either Right(A a) => new Either.Right(a); +} + +[TransformMonad(typeof(Writer2), typeof(Either))] +public static partial class WriterEither +{ + public static Writer2> Append(A value, L log) => + Writer2.Append(Either.Right(value), log); + + public static Writer2> Append(A value, Func logFn) => + Append(value, logFn(value)); + + public static Writer2> Left(B b) => Writer2.Append(Either.Left(b), b); +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonad#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonad#FunicularSwitch.Test.MonadA.g.verified.cs index 1e74052d..3fc1a21d 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonad#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonad#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs index 47b64415..dc44836d 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs index 04a25f28..eb7f8ca2 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs index f1b75d25..e40ebd17 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs index b4f10fb5..c8963c08 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs index 9b093288..8f1a6e60 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.GenericMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => s0.Bind(v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => Combine(s0, s1).Bind(prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => Combine(s0, s1, s2).Bind(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => Combine(s0, s1, s2, s3).Bind(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => Combine(s0, s1, s2, s3, s4).Bind(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => Combine(s0, s1, s2, s3, s4, s5).Bind(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => Combine(s0, s1, s2, s3, s4, s5, s6).Bind(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => Combine(s0, s1, s2, s3, s4, s5, s6, s7).Bind(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8).Bind(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9).Bind(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10).Bind(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonad#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonad#FunicularSwitch.Test.MonadA.g.verified.cs index f6866b0a..282d6acf 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonad#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonad#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs index 7a346f7a..7c6e25d7 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs index f8791c4c..dbaa7a4f 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs index 2f931262..47b1bf76 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs index e011c1ba..5cd2295b 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs index e4d909e1..1fb9aba8 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/ExtendMonadGeneratorTest.StaticMonadMultipleParameters_typeArguments=T, U, V, W, X#FunicularSwitch.Test.MonadA.g.verified.cs @@ -50,5 +50,47 @@ public static partial class MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return(fn(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1) => global::FunicularSwitch.Test.MonadA.Bind(s0, v0 => s1.Map(v1 => (v0, v1))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1), prev => s2.Map(last => (prev.Item1, prev.Item2, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2), prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3), prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4), prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5), prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6), prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7), prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Combine(global::FunicularSwitch.Test.MonadA s0, global::FunicularSwitch.Test.MonadA s1, global::FunicularSwitch.Test.MonadA s2, global::FunicularSwitch.Test.MonadA s3, global::FunicularSwitch.Test.MonadA s4, global::FunicularSwitch.Test.MonadA s5, global::FunicularSwitch.Test.MonadA s6, global::FunicularSwitch.Test.MonadA s7, global::FunicularSwitch.Test.MonadA s8, global::FunicularSwitch.Test.MonadA s9, global::FunicularSwitch.Test.MonadA s10, global::FunicularSwitch.Test.MonadA s11) => global::FunicularSwitch.Test.MonadA.Bind(Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA Flatten(this global::FunicularSwitch.Test.MonadA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorInteropTest.TransformResultType#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorInteropTest.TransformResultType#FunicularSwitch.Test.MonadAB.g.verified.cs index 8b831fae..f5923fa3 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorInteropTest.TransformResultType#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorInteropTest.TransformResultType#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Ok(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Ok(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Ok(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA>.Ok(global::FunicularSwitch.Test.MonadB.Ok((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA>.Ok(global::FunicularSwitch.Test.MonadB.Ok(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..1a70313c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,166 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public readonly partial record struct MonadAB(global::FunicularSwitch.Test.MonadA> M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator MonadAB(global::FunicularSwitch.Test.MonadA> ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + A_ global::FunicularSwitch.Transformers.Monad.Cast() => (A_)(object)M; + } + + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Map(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Select(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt new file mode 100644 index 00000000..e5a13477 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,64), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} \ No newline at end of file diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..1df7f81b --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,166 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public readonly partial record struct MonadAB(global::FunicularSwitch.Test.MonadA> M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator MonadAB(global::FunicularSwitch.Test.MonadA> ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + A_ global::FunicularSwitch.Transformers.Monad.Cast() => (A_)(object)M; + } + + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Map(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Select(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt new file mode 100644 index 00000000..36a52714 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,58), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} \ No newline at end of file diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..fb3b2cdd --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,166 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public readonly partial record struct MonadAB(global::FunicularSwitch.Test.MonadA> M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator MonadAB(global::FunicularSwitch.Test.MonadA> ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + A_ global::FunicularSwitch.Transformers.Monad.Cast() => (A_)(object)M; + } + + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Map(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Select(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt new file mode 100644 index 00000000..2e2ea630 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,52), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..a271cdb5 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,166 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public readonly partial record struct MonadAB(global::FunicularSwitch.Test.MonadA> M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator MonadAB(global::FunicularSwitch.Test.MonadA> ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + A_ global::FunicularSwitch.Transformers.Monad.Cast() => (A_)(object)M; + } + + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Map(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Select(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt new file mode 100644 index 00000000..2a7318cc --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,55), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..228ddb53 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,166 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public readonly partial record struct MonadAB(global::FunicularSwitch.Test.MonadA> M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator MonadAB(global::FunicularSwitch.Test.MonadA> ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + A_ global::FunicularSwitch.Transformers.Monad.Cast() => (A_)(object)M; + } + + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Map(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Map(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Map(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Select(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Select(this global::System.Threading.Tasks.Task> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt new file mode 100644 index 00000000..2e2ea630 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.GenericTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,52), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethods#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethods#FunicularSwitch.Test.MonadAB.g.verified.cs index bd0b8831..17180a55 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethods#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethods#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.ReturnAReturnB(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.ReturnAReturnB(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.BindABindB(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> ReturnAReturnB(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.ReturnA>(global::FunicularSwitch.Test.MonadB.ReturnB((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB BindABindB(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB BindABindB(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> BindABindB(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> BindABindB(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> BindABindB(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> BindABindB(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB BindABindB(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB BindABindB(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> BindABindB(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> BindABindB(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> BindABindB(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> BindABindB(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).BindABindB([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.ReturnA>(global::FunicularSwitch.Test.MonadB.ReturnB(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.BindABindB([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).BindABindB([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).BindABindB([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethodsFromGeneric#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethodsFromGeneric#FunicularSwitch.Test.MonadAB.g.verified.cs index c69861fa..0906896a 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethodsFromGeneric#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadMethodsFromGeneric#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadTypes#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadTypes#FunicularSwitch.Test.MonadAB.g.verified.cs index 9212b1de..afc38349 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadTypes#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.ImplicitMonadTypes#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.MultipleTransformers#FunicularSwitch.Test.MonadABA.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.MultipleTransformers#FunicularSwitch.Test.MonadABA.g.verified.cs index de932e2a..417706b2 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.MultipleTransformers#FunicularSwitch.Test.MonadABA.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.MultipleTransformers#FunicularSwitch.Test.MonadABA.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadABA(global::FunicularSwitch.Test.M [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>>(MonadABA ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadABA.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadABA.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadABA)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -40,7 +40,7 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA_global__Funicul [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB)global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB)global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)M, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(a => (global::FunicularSwitch.Test.MonadA>)(Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB)fn(a)).Invoke(a))).Cast>>(); + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB)global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)M, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(a => (global::FunicularSwitch.Test.MonadA>)(Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB)fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public B Cast() => (B)(object)M; } @@ -64,40 +64,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA_global__Funicul public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA>>.Return(global::FunicularSwitch.Test.MonadB>.Return(global::FunicularSwitch.Test.MonadA.Return((await a)))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABA Bind(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static global::FunicularSwitch.Test.MonadABA Bind(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABA Bind(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static global::FunicularSwitch.Test.MonadABA Bind(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABA SelectMany(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static global::FunicularSwitch.Test.MonadABA SelectMany(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABA SelectMany(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static global::FunicularSwitch.Test.MonadABA SelectMany(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>>> fn) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)((global::FunicularSwitch.Test.MonadA>>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadABA SelectMany(this global::FunicularSwitch.Test.MonadABA ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadABA)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -134,5 +134,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA_global__Funicul [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA>>.Return(global::FunicularSwitch.Test.MonadB>.Return(global::FunicularSwitch.Test.MonadA.Return(fn(a))))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1) => global::FunicularSwitch.Test.MonadAT.BindT((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func>>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6, global::FunicularSwitch.Test.MonadABA s7) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6, global::FunicularSwitch.Test.MonadABA s7, global::FunicularSwitch.Test.MonadABA s8) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6, global::FunicularSwitch.Test.MonadABA s7, global::FunicularSwitch.Test.MonadABA s8, global::FunicularSwitch.Test.MonadABA s9) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6, global::FunicularSwitch.Test.MonadABA s7, global::FunicularSwitch.Test.MonadABA s8, global::FunicularSwitch.Test.MonadABA s9, global::FunicularSwitch.Test.MonadABA s10) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadABA s0, global::FunicularSwitch.Test.MonadABA s1, global::FunicularSwitch.Test.MonadABA s2, global::FunicularSwitch.Test.MonadABA s3, global::FunicularSwitch.Test.MonadABA s4, global::FunicularSwitch.Test.MonadABA s5, global::FunicularSwitch.Test.MonadABA s6, global::FunicularSwitch.Test.MonadABA s7, global::FunicularSwitch.Test.MonadABA s8, global::FunicularSwitch.Test.MonadABA s9, global::FunicularSwitch.Test.MonadABA s10, global::FunicularSwitch.Test.MonadABA s11) => global::FunicularSwitch.Test.MonadAT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(global::FunicularSwitch.Test.MonadA>>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA_global__FunicularSwitch_Test_MonadB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABA Flatten(this global::FunicularSwitch.Test.MonadABA> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonad#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonad#FunicularSwitch.Test.MonadAB.g.verified.cs index 40d3797f..edf62713 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonad#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonad#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -36,22 +36,22 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -79,5 +79,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..53dcb591 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, .verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=T, U, V, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..30206d9e --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, V, _innerTypeParameters=W, X, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..3941e2e4 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, U, _innerTypeParameters=V, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..6d0207db --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=.verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..4e7aa215 --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=T, _innerTypeParameters=U, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs new file mode 100644 index 00000000..022a799c --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Generators.TransformMonadAttribute.g.verified.cs @@ -0,0 +1,15 @@ +//HintName: FunicularSwitch.Generators.TransformMonadAttribute.g.cs +using System; + +namespace FunicularSwitch.Generators +{ + /// + /// This generator is still considered experimental and might break. + /// Please open any issues you may find in the GitHub repo. + /// + [AttributeUsage((AttributeTargets)12, AllowMultiple = false, Inherited = false)] + internal class TransformMonadAttribute : Attribute + { + public TransformMonadAttribute(System.Type monadType, System.Type transformerType, params System.Type[] extraTransformerTypes) { } + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs new file mode 100644 index 00000000..389f792d --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, #FunicularSwitch.Test.MonadAB.g.verified.cs @@ -0,0 +1,125 @@ +//HintName: FunicularSwitch.Test.MonadAB.g.cs +namespace FunicularSwitch.Test +{ + public static partial class MonadAB + { + private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA M) : global::FunicularSwitch.Transformers.Monad + { + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator Impl__FunicularSwitch_Test_MonadA(global::FunicularSwitch.Test.MonadA ma) => new(ma); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static implicit operator global::FunicularSwitch.Test.MonadA(Impl__FunicularSwitch_Test_MonadA ma) => ma.M; + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Return(B a) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Return(a); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public global::FunicularSwitch.Transformers.Monad Bind(global::System.Func> fn) => (Impl__FunicularSwitch_Test_MonadA)global::FunicularSwitch.Test.MonadA.Bind(M, a => (global::FunicularSwitch.Test.MonadA)(Impl__FunicularSwitch_Test_MonadA)fn(a)); + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public B Cast() => (B)(object)M; + } + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Lift(global::FunicularSwitch.Test.MonadA ma) => global::FunicularSwitch.Test.MonadA.Bind(ma, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Lift(global::System.Threading.Tasks.Task> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Lift(global::System.Threading.Tasks.ValueTask> ma) => global::FunicularSwitch.Test.MonadA.Bind((await ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Return(A a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(a)); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Return(global::System.Threading.Tasks.Task a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Bind(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Bind(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Bind(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> SelectMany(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func>> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> SelectMany(this global::System.Threading.Tasks.Task>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> SelectMany(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func>> fn, global::System.Func selector) => (await ma).SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadA>)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Map(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Map(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Map(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Select(this global::FunicularSwitch.Test.MonadA> ma, global::System.Func fn) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Select(this global::System.Threading.Tasks.Task>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Select(this global::System.Threading.Tasks.ValueTask>> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Combine(global::FunicularSwitch.Test.MonadA> s0, global::FunicularSwitch.Test.MonadA> s1, global::FunicularSwitch.Test.MonadA> s2, global::FunicularSwitch.Test.MonadA> s3, global::FunicularSwitch.Test.MonadA> s4, global::FunicularSwitch.Test.MonadA> s5, global::FunicularSwitch.Test.MonadA> s6, global::FunicularSwitch.Test.MonadA> s7, global::FunicularSwitch.Test.MonadA> s8, global::FunicularSwitch.Test.MonadA> s9, global::FunicularSwitch.Test.MonadA> s10, global::FunicularSwitch.Test.MonadA> s11) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadA> Flatten(this global::FunicularSwitch.Test.MonadA>>> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task>> Flatten(this global::System.Threading.Tasks.Task>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask>> Flatten(this global::System.Threading.Tasks.ValueTask>>>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + } +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt new file mode 100644 index 00000000..197d41aa --- /dev/null +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.StaticTransformedMonadWithMultipleParameters_outerTypeParameters=_innerTypeParameters=T, .verified.txt @@ -0,0 +1,18 @@ +{ + Diagnostics: [ + { + Location: : (28,0)-(29,36), + Message: Generator for TransformMonadAttribute is considered experimental and might break, + Severity: Info, + WarningLevel: 1, + Descriptor: { + Id: FUN0016, + Title: Generator is experimental, + MessageFormat: Generator for TransformMonadAttribute is considered experimental and might break, + Category: ResultTypeGenerator, + DefaultSeverity: Info, + IsEnabledByDefault: true + } + } + ] +} diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=internal partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=internal partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index 95f1799d..36a01b70 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=internal partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=internal partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -9,7 +9,7 @@ internal partial class MonadAMonadB(global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -51,40 +51,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -121,5 +121,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index 0d6afa57..3d1b28ce 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial class#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -9,7 +9,7 @@ public partial class MonadAMonadB(global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -51,40 +51,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -121,5 +121,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index 8237c206..410d7402 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -8,7 +8,7 @@ public partial record struct MonadAMonadB(global::FunicularSwitch.Test.MonadA [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index cc9b30ba..a0e93671 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial record#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -8,7 +8,7 @@ public partial record MonadAMonadB(global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index ebd725bc..98b40a01 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -9,7 +9,7 @@ public partial struct MonadAMonadB(global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -51,40 +51,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -121,5 +121,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index d4e40f92..6acf0cb8 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial record struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAMonadB(global::FunicularSwitch.Te [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs index 2d12c900..0962963d 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.TypeModifiers_modifier=public readonly partial struct#FunicularSwitch.Test.MonadAMonadB.g.verified.cs @@ -9,7 +9,7 @@ public readonly partial struct MonadAMonadB(global::FunicularSwitch.Test.Mona [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAMonadB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAMonadB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAMonadB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -51,40 +51,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB Bind(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAMonadB SelectMany(this global::FunicularSwitch.Test.MonadAMonadB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAMonadB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -121,5 +121,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA.Return>(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAMonadB s0, global::FunicularSwitch.Test.MonadAMonadB s1, global::FunicularSwitch.Test.MonadAMonadB s2, global::FunicularSwitch.Test.MonadAMonadB s3, global::FunicularSwitch.Test.MonadAMonadB s4, global::FunicularSwitch.Test.MonadAMonadB s5, global::FunicularSwitch.Test.MonadAMonadB s6, global::FunicularSwitch.Test.MonadAMonadB s7, global::FunicularSwitch.Test.MonadAMonadB s8, global::FunicularSwitch.Test.MonadAMonadB s9, global::FunicularSwitch.Test.MonadAMonadB s10, global::FunicularSwitch.Test.MonadAMonadB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAMonadB Flatten(this global::FunicularSwitch.Test.MonadAMonadB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithMonadImplementingInterface#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithMonadImplementingInterface#FunicularSwitch.Test.MonadAB.g.verified.cs index 839b9b9f..b705c64c 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithMonadImplementingInterface#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithMonadImplementingInterface#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -36,40 +36,40 @@ public static partial class MonadAB public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -106,5 +106,47 @@ public static partial class MonadAB [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((global::FunicularSwitch.Test.MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadAB.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadAB.g.verified.cs index c69861fa..0906896a 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadAB.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadAB.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadAB(global::FunicularSwitch.Test.Mo [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadA>(MonadAB ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadAB.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadAB)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -50,40 +50,40 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB Bind(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)((global::FunicularSwitch.Test.MonadA>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadAB SelectMany(this global::FunicularSwitch.Test.MonadAB ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadAB)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -120,5 +120,47 @@ private readonly record struct Impl__FunicularSwitch_Test_MonadA(global::Funi [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadA>.Return(global::FunicularSwitch.Test.MonadB.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1) => global::FunicularSwitch.Test.MonadBT.BindT((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1), (S0, S1, S2)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadA>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadA>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadA>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadA>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadA>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadA>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadA>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadA>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadA>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadAB s0, global::FunicularSwitch.Test.MonadAB s1, global::FunicularSwitch.Test.MonadAB s2, global::FunicularSwitch.Test.MonadAB s3, global::FunicularSwitch.Test.MonadAB s4, global::FunicularSwitch.Test.MonadAB s5, global::FunicularSwitch.Test.MonadAB s6, global::FunicularSwitch.Test.MonadAB s7, global::FunicularSwitch.Test.MonadAB s8, global::FunicularSwitch.Test.MonadAB s9, global::FunicularSwitch.Test.MonadAB s10, global::FunicularSwitch.Test.MonadAB s11) => global::FunicularSwitch.Test.MonadBT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((Impl__FunicularSwitch_Test_MonadA>)(global::FunicularSwitch.Test.MonadA>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (Impl__FunicularSwitch_Test_MonadA>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadA>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadAB Flatten(this global::FunicularSwitch.Test.MonadAB> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadABC.g.verified.cs b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadABC.g.verified.cs index 0ad7b6c6..8765fa45 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadABC.g.verified.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/Snapshots/TransformerGeneratorTest.WithTransformedMonads#FunicularSwitch.Test.MonadABC.g.verified.cs @@ -8,7 +8,7 @@ public readonly partial record struct MonadABC(global::FunicularSwitch.Test.M [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static implicit operator global::FunicularSwitch.Test.MonadAB>(MonadABC ma) => ma.M; [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadABC.Return(a); + global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Return(A_ a) => MonadABC.Return(a); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] global::FunicularSwitch.Transformers.Monad global::FunicularSwitch.Transformers.Monad.Bind(global::System.Func> fn) => this.Bind(a => (MonadABC)fn(a)); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] @@ -36,40 +36,40 @@ public static partial class MonadABC public static async global::System.Threading.Tasks.ValueTask> Return(global::System.Threading.Tasks.ValueTask a) => global::FunicularSwitch.Test.MonadAB.Return(global::FunicularSwitch.Test.MonadC.Return((await a))); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABC Bind(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadABC Bind(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABC Bind(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadABC Bind(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> Bind(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> Bind(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABC SelectMany(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadABC SelectMany(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static global::FunicularSwitch.Test.MonadABC SelectMany(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static global::FunicularSwitch.Test.MonadABC SelectMany(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)ma), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.Task> SelectMany(this global::System.Threading.Tasks.Task> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] - public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); + public static async global::System.Threading.Tasks.ValueTask> SelectMany(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func>> fn) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)((global::FunicularSwitch.Test.MonadAB>)(await ma)), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => fn(a)).Invoke(a))).Cast>>(); [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static global::FunicularSwitch.Test.MonadABC SelectMany(this global::FunicularSwitch.Test.MonadABC ma, global::System.Func> fn, global::System.Func selector) => ma.SelectMany([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => ((global::FunicularSwitch.Test.MonadABC)fn(a)).Map([global::System.Diagnostics.DebuggerStepThroughAttribute](b) => selector(a, b))); @@ -106,5 +106,47 @@ public static partial class MonadABC [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] public static async global::System.Threading.Tasks.ValueTask> Select(this global::System.Threading.Tasks.ValueTask> ma, global::System.Func fn) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => global::FunicularSwitch.Test.MonadAB.Return(global::FunicularSwitch.Test.MonadC.Return(fn(a)))); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1) => global::FunicularSwitch.Test.MonadCT.BindT((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)s0, [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func>>(v0 => s1.Map(v1 => (v0, v1))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1), (S0, S1, S2)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1), global::FunicularSwitch.Test.MonadAB>>(prev => s2.Map(last => (prev.Item1, prev.Item2, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2), (S0, S1, S2, S3)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2), global::FunicularSwitch.Test.MonadAB>>(prev => s3.Map(last => (prev.Item1, prev.Item2, prev.Item3, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3), (S0, S1, S2, S3, S4)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3), global::FunicularSwitch.Test.MonadAB>>(prev => s4.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4), (S0, S1, S2, S3, S4, S5)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4), global::FunicularSwitch.Test.MonadAB>>(prev => s5.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5), (S0, S1, S2, S3, S4, S5, S6)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5), global::FunicularSwitch.Test.MonadAB>>(prev => s6.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6, S7)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6, global::FunicularSwitch.Test.MonadABC s7) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5, S6), (S0, S1, S2, S3, S4, S5, S6, S7)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5, s6), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6), global::FunicularSwitch.Test.MonadAB>>(prev => s7.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6, S7, S8)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6, global::FunicularSwitch.Test.MonadABC s7, global::FunicularSwitch.Test.MonadABC s8) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7), (S0, S1, S2, S3, S4, S5, S6, S7, S8)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5, s6, s7), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7), global::FunicularSwitch.Test.MonadAB>>(prev => s8.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6, global::FunicularSwitch.Test.MonadABC s7, global::FunicularSwitch.Test.MonadABC s8, global::FunicularSwitch.Test.MonadABC s9) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8), global::FunicularSwitch.Test.MonadAB>>(prev => s9.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6, global::FunicularSwitch.Test.MonadABC s7, global::FunicularSwitch.Test.MonadABC s8, global::FunicularSwitch.Test.MonadABC s9, global::FunicularSwitch.Test.MonadABC s10) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9), global::FunicularSwitch.Test.MonadAB>>(prev => s10.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)> Combine(global::FunicularSwitch.Test.MonadABC s0, global::FunicularSwitch.Test.MonadABC s1, global::FunicularSwitch.Test.MonadABC s2, global::FunicularSwitch.Test.MonadABC s3, global::FunicularSwitch.Test.MonadABC s4, global::FunicularSwitch.Test.MonadABC s5, global::FunicularSwitch.Test.MonadABC s6, global::FunicularSwitch.Test.MonadABC s7, global::FunicularSwitch.Test.MonadABC s8, global::FunicularSwitch.Test.MonadABC s9, global::FunicularSwitch.Test.MonadABC s10, global::FunicularSwitch.Test.MonadABC s11) => global::FunicularSwitch.Test.MonadCT.BindT<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), (S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11)>((global::FunicularSwitch.Test.MonadAB>)(global::FunicularSwitch.Test.MonadAB>)Combine(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10), [global::System.Diagnostics.DebuggerStepThroughAttribute](a) => (global::FunicularSwitch.Test.MonadAB>)(new global::System.Func<(S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10), global::FunicularSwitch.Test.MonadAB>>(prev => s11.Map(last => (prev.Item1, prev.Item2, prev.Item3, prev.Item4, prev.Item5, prev.Item6, prev.Item7, prev.Item8, prev.Item9, prev.Item10, prev.Item11, last))).Invoke(a))).Cast>>(); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static global::FunicularSwitch.Test.MonadABC Flatten(this global::FunicularSwitch.Test.MonadABC> ma) => ma.Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.Task> Flatten(this global::System.Threading.Tasks.Task>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); + + [global::System.Diagnostics.Contracts.PureAttribute, global::System.Diagnostics.DebuggerStepThroughAttribute] + public static async global::System.Threading.Tasks.ValueTask> Flatten(this global::System.Threading.Tasks.ValueTask>> ma) => (await ma).Bind([global::System.Diagnostics.DebuggerStepThroughAttribute](a) => a); } } diff --git a/Source/Tests/FunicularSwitch.Generators.Test/TransformerGeneratorTest.cs b/Source/Tests/FunicularSwitch.Generators.Test/TransformerGeneratorTest.cs index d50f2ec4..6f2026af 100644 --- a/Source/Tests/FunicularSwitch.Generators.Test/TransformerGeneratorTest.cs +++ b/Source/Tests/FunicularSwitch.Generators.Test/TransformerGeneratorTest.cs @@ -1,5 +1,3 @@ -using FluentAssertions; - namespace FunicularSwitch.Generators.Test; public class VerifyTransformerInteropSourceGenerator() : BaseVerifySourceGenerators(new TransformerGenerator(), new ResultTypeGenerator()); @@ -8,54 +6,47 @@ namespace FunicularSwitch.Generators.Test; public class TransformerGeneratorTest : VerifySourceGenerator { [TestMethod] - [DataRow("public partial class")] - [DataRow("public partial struct")] - [DataRow("public partial record")] - [DataRow("public partial record struct")] - [DataRow("public readonly partial struct")] - [DataRow("public readonly partial record struct")] - [DataRow("internal partial class")] - public Task TypeModifiers(string modifier) + public Task GenericMonadsMissingBindMethod() { var code = /*lang=csharp*/ $$""" - using System; - using FunicularSwitch.Generators; - using FunicularSwitch.Transformers; + using System; + using FunicularSwitch.Generators; + using FunicularSwitch.Transformers; - namespace FunicularSwitch.Test; + namespace FunicularSwitch.Test; - public record MonadA(A Value); - public class MonadA - { - public static MonadA Return(A a) => throw new NotImplementedException(); - - public static MonadA Bind(MonadA ma, Func> fn) => throw new NotImplementedException(); - } - public record MonadB(B Value); - public class MonadB - { - public static MonadB Return(A a) => throw new NotImplementedException(); - - public static MonadB Bind(MonadB ma, Func> fn) => throw new NotImplementedException(); - } + public record MonadA(A Value) + { + public static MonadA Return(A a) => throw new NotImplementedException(); + } - [MonadTransformer(typeof(MonadB))] - public class MonadBT - { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); - } + public record MonadB(B Value) + { + public static MonadB Return(B a) => throw new NotImplementedException(); + } - [TransformMonad(typeof(MonadA), typeof(MonadBT))] - {{modifier}} MonadAMonadB; - """; + [MonadTransformer(typeof(MonadB<>))] + public class MonadBT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } + + [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] + public readonly partial record struct MonadAB; + """; return Verify(code); } [TestMethod] - public Task ImplicitMonadTypes() + [DataRow("T, ", "")] + [DataRow("", "T, ")] + [DataRow("T, ", "U, ")] + [DataRow("T, U, ", "V, ")] + [DataRow("T, U, V, ", "W, X, ")] + public Task GenericTransformedMonadWithMultipleParameters(string outerTypeParameters, string innerTypeParameters) { var code = /*lang=csharp*/ @@ -66,29 +57,30 @@ public Task ImplicitMonadTypes() namespace FunicularSwitch.Test; - public record MonadA(A Value); + public record MonadA<{{outerTypeParameters}}A>(A Value); public class MonadA { - public static MonadA Return(A a) => throw new NotImplementedException(); + public static MonadA<{{outerTypeParameters}}A> Return<{{outerTypeParameters}}A>(A a) => throw new NotImplementedException(); - public static MonadA Bind(MonadA ma, Func> fn) => throw new NotImplementedException(); + public static MonadA<{{outerTypeParameters}}B> Bind<{{outerTypeParameters}}A, B>(MonadA<{{outerTypeParameters}}A> ma, Func> fn) => throw new NotImplementedException(); } - public record MonadB(B Value); + + public record MonadB<{{innerTypeParameters}}B>(B Value); public class MonadB { - public static MonadB Return(A a) => throw new NotImplementedException(); + public static MonadB<{{innerTypeParameters}}A> Return<{{innerTypeParameters}}A>(A a) => throw new NotImplementedException(); - public static MonadB Bind(MonadB ma, Func> fn) => throw new NotImplementedException(); + public static MonadB<{{innerTypeParameters}}B> Bind<{{innerTypeParameters}}A, B>(MonadB<{{innerTypeParameters}}A> ma, Func> fn) => throw new NotImplementedException(); } [MonadTransformer(typeof(MonadB))] public class MonadBT { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + public static Monad> BindT<{{innerTypeParameters}}A, B>(Monad> ma, Func>> fn) => throw new NotImplementedException(); } [TransformMonad(typeof(MonadA), typeof(MonadBT))] - public readonly partial record struct MonadAB; + public readonly partial record struct MonadAB<{{outerTypeParameters}}{{innerTypeParameters}}A>; """; return Verify(code); @@ -173,7 +165,7 @@ public class MonadBT } [TestMethod] - public Task MultipleTransformers() + public Task ImplicitMonadTypes() { var code = /*lang=csharp*/ @@ -181,43 +173,39 @@ public Task MultipleTransformers() using System; using FunicularSwitch.Generators; using FunicularSwitch.Transformers; - + namespace FunicularSwitch.Test; - - public record MonadA(A Value) + + public record MonadA(A Value); + public class MonadA { - public static MonadA Return(A a) => throw new NotImplementedException(); + public static MonadA Return(A a) => throw new NotImplementedException(); - public MonadA Bind(Func> fn) => throw new NotImplementedException(); + public static MonadA Bind(MonadA ma, Func> fn) => throw new NotImplementedException(); } - public record MonadB(B Value) + public record MonadB(B Value); + public class MonadB { - public static MonadB Return(B a) => throw new NotImplementedException(); + public static MonadB Return(A a) => throw new NotImplementedException(); - public MonadB Bind(Func> fn) => throw new NotImplementedException(); - } - - [MonadTransformer(typeof(MonadA<>))] - public class MonadAT - { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + public static MonadB Bind(MonadB ma, Func> fn) => throw new NotImplementedException(); } - - [MonadTransformer(typeof(MonadB<>))] + + [MonadTransformer(typeof(MonadB))] public class MonadBT { public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); } - - [TransformMonad(typeof(MonadA<>), typeof(MonadBT), typeof(MonadAT))] - public readonly partial record struct MonadABA; + + [TransformMonad(typeof(MonadA), typeof(MonadBT))] + public readonly partial record struct MonadAB; """; return Verify(code); } [TestMethod] - public Task WithTransformedMonads() + public Task InnerMonadWithoutReturnMethod() { var code = /*lang=csharp*/ @@ -225,52 +213,36 @@ public Task WithTransformedMonads() using System; using FunicularSwitch.Generators; using FunicularSwitch.Transformers; - + namespace FunicularSwitch.Test; - + public record MonadA(A Value) { public static MonadA Return(A a) => throw new NotImplementedException(); public MonadA Bind(Func> fn) => throw new NotImplementedException(); } + public record MonadB(B Value) { - public static MonadB Return(B a) => throw new NotImplementedException(); - public MonadB Bind(Func> fn) => throw new NotImplementedException(); } - public record MonadC(C Value) - { - public static MonadC Return(C a) => throw new NotImplementedException(); - - public MonadC Bind(Func> fn) => throw new NotImplementedException(); - } - + [MonadTransformer(typeof(MonadB<>))] public class MonadBT { public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); } - - [MonadTransformer(typeof(MonadC<>))] - public class MonadCT - { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); - } - + [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] public readonly partial record struct MonadAB; - - [TransformMonad(typeof(MonadAB<>), typeof(MonadCT))] - public readonly partial record struct MonadABC; """; return Verify(code); } [TestMethod] - public Task WithMonadImplementingInterface() + public Task MonadTransformerMissingBindTMethod() { var code = /*lang=csharp*/ @@ -278,35 +250,28 @@ public Task WithMonadImplementingInterface() using System; using FunicularSwitch.Generators; using FunicularSwitch.Transformers; - + namespace FunicularSwitch.Test; - - public record MonadA(A Value) : Monad + + public record MonadA(A Value) { public static MonadA Return(A a) => throw new NotImplementedException(); public MonadA Bind(Func> fn) => throw new NotImplementedException(); - - Monad Monad.Return(B value) => throw new NotImplementedException(); - - Monad Monad.Bind(Func> fn) => throw new NotImplementedException(); - - B Monad.Cast() => throw new NotImplementedException(); } - + public record MonadB(B Value) { public static MonadB Return(B a) => throw new NotImplementedException(); public MonadB Bind(Func> fn) => throw new NotImplementedException(); } - + [MonadTransformer(typeof(MonadB<>))] public class MonadBT { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); } - + [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] public readonly partial record struct MonadAB; """; @@ -353,44 +318,51 @@ public class MonadBT } [TestMethod] - public Task OuterMonadWithoutReturnMethod() + public Task MultipleTransformers() { var code = /*lang=csharp*/ - $$""" - using System; - using FunicularSwitch.Generators; - using FunicularSwitch.Transformers; + """ + using System; + using FunicularSwitch.Generators; + using FunicularSwitch.Transformers; - namespace FunicularSwitch.Test; + namespace FunicularSwitch.Test; - public record MonadA(A Value) - { - public MonadA Bind(Func> fn) => throw new NotImplementedException(); - } + public record MonadA(A Value) + { + public static MonadA Return(A a) => throw new NotImplementedException(); + + public MonadA Bind(Func> fn) => throw new NotImplementedException(); + } + public record MonadB(B Value) + { + public static MonadB Return(B a) => throw new NotImplementedException(); + + public MonadB Bind(Func> fn) => throw new NotImplementedException(); + } - public record MonadB(B Value) - { - public static MonadB Return(B a) => throw new NotImplementedException(); - - public MonadB Bind(Func> fn) => throw new NotImplementedException(); - } + [MonadTransformer(typeof(MonadA<>))] + public class MonadAT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } - [MonadTransformer(typeof(MonadB<>))] - public class MonadBT - { - public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); - } + [MonadTransformer(typeof(MonadB<>))] + public class MonadBT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } - [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] - public readonly partial record struct MonadAB; - """; + [TransformMonad(typeof(MonadA<>), typeof(MonadBT), typeof(MonadAT))] + public readonly partial record struct MonadABA; + """; return Verify(code); } [TestMethod] - public Task InnerMonadWithoutReturnMethod() + public Task OuterMonadWithoutReturnMethod() { var code = /*lang=csharp*/ @@ -398,18 +370,18 @@ public Task InnerMonadWithoutReturnMethod() using System; using FunicularSwitch.Generators; using FunicularSwitch.Transformers; - + namespace FunicularSwitch.Test; public record MonadA(A Value) { - public static MonadA Return(A a) => throw new NotImplementedException(); - public MonadA Bind(Func> fn) => throw new NotImplementedException(); } public record MonadB(B Value) { + public static MonadB Return(B a) => throw new NotImplementedException(); + public MonadB Bind(Func> fn) => throw new NotImplementedException(); } @@ -463,7 +435,7 @@ public class MonadBT } [TestMethod] - public Task GenericMonadsMissingBindMethod() + public Task StaticMonadsMissingBindMethod() { var code = /*lang=csharp*/ @@ -474,23 +446,24 @@ public Task GenericMonadsMissingBindMethod() namespace FunicularSwitch.Test; - public record MonadA(A Value) + public record MonadA(A Value); + public class MonadA { - public static MonadA Return(A a) => throw new NotImplementedException(); + public static MonadA Return(A a) => throw new NotImplementedException(); } - - public record MonadB(B Value) + public record MonadB(B Value); + public class MonadB { - public static MonadB Return(B a) => throw new NotImplementedException(); + public static MonadB Return(A a) => throw new NotImplementedException(); } - [MonadTransformer(typeof(MonadB<>))] + [MonadTransformer(typeof(MonadB))] public class MonadBT { public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); } - [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] + [TransformMonad(typeof(MonadA), typeof(MonadBT))] public readonly partial record struct MonadAB; """; @@ -498,7 +471,7 @@ public class MonadBT } [TestMethod] - public Task StaticMonadsMissingBindMethod() + public Task StaticTransformedMonad() { var code = /*lang=csharp*/ @@ -513,11 +486,16 @@ public record MonadA(A Value); public class MonadA { public static MonadA Return(A a) => throw new NotImplementedException(); + + public static MonadA Bind(MonadA ma, Func> fn) => throw new NotImplementedException(); } + public record MonadB(B Value); public class MonadB { public static MonadB Return(A a) => throw new NotImplementedException(); + + public static MonadB Bind(MonadB ma, Func> fn) => throw new NotImplementedException(); } [MonadTransformer(typeof(MonadB))] @@ -527,14 +505,20 @@ public class MonadBT } [TransformMonad(typeof(MonadA), typeof(MonadBT))] - public readonly partial record struct MonadAB; + public static partial class MonadAB; """; return Verify(code); } - + [TestMethod] - public Task MonadTransformerMissingBindTMethod() + [DataRow("T, ", "")] + [DataRow("", "T, ")] + [DataRow("T, ", "U, ")] + [DataRow("T, U, ", "V, ")] + [DataRow("T, U, V, ", "W, X, ")] + [DataRow("T, U, V, ", "T, U, V, ")] + public Task StaticTransformedMonadWithMultipleParameters(string outerTypeParameters, string innerTypeParameters) { var code = /*lang=csharp*/ @@ -545,34 +529,44 @@ public Task MonadTransformerMissingBindTMethod() namespace FunicularSwitch.Test; - public record MonadA(A Value) + public record MonadA<{{outerTypeParameters}}A>(A Value); + public class MonadA { - public static MonadA Return(A a) => throw new NotImplementedException(); + public static MonadA<{{outerTypeParameters}}A> Return<{{outerTypeParameters}}A>(A a) => throw new NotImplementedException(); - public MonadA Bind(Func> fn) => throw new NotImplementedException(); + public static MonadA<{{outerTypeParameters}}B> Bind<{{outerTypeParameters}}A, B>(MonadA<{{outerTypeParameters}}A> ma, Func> fn) => throw new NotImplementedException(); } - - public record MonadB(B Value) + + public record MonadB<{{innerTypeParameters}}B>(B Value); + public class MonadB { - public static MonadB Return(B a) => throw new NotImplementedException(); + public static MonadB<{{innerTypeParameters}}A> Return<{{innerTypeParameters}}A>(A a) => throw new NotImplementedException(); - public MonadB Bind(Func> fn) => throw new NotImplementedException(); + public static MonadB<{{innerTypeParameters}}B> Bind<{{innerTypeParameters}}A, B>(MonadB<{{innerTypeParameters}}A> ma, Func> fn) => throw new NotImplementedException(); } - [MonadTransformer(typeof(MonadB<>))] + [MonadTransformer(typeof(MonadB))] public class MonadBT { + public static Monad> BindT<{{innerTypeParameters}}A, B>(Monad> ma, Func>> fn) => throw new NotImplementedException(); } - [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] - public readonly partial record struct MonadAB; + [TransformMonad(typeof(MonadA), typeof(MonadBT))] + public static partial class MonadAB; """; return Verify(code); } [TestMethod] - public Task StaticTransformedMonad() + [DataRow("public partial class")] + [DataRow("public partial struct")] + [DataRow("public partial record")] + [DataRow("public partial record struct")] + [DataRow("public readonly partial struct")] + [DataRow("public readonly partial record struct")] + [DataRow("internal partial class")] + public Task TypeModifiers(string modifier) { var code = /*lang=csharp*/ @@ -590,7 +584,6 @@ public class MonadA public static MonadA Bind(MonadA ma, Func> fn) => throw new NotImplementedException(); } - public record MonadB(B Value); public class MonadB { @@ -606,11 +599,109 @@ public class MonadBT } [TransformMonad(typeof(MonadA), typeof(MonadBT))] - public static partial class MonadAB; + {{modifier}} MonadAMonadB; """; return Verify(code); } + + [TestMethod] + public Task WithMonadImplementingInterface() + { + var code = + /*lang=csharp*/ + """ + using System; + using FunicularSwitch.Generators; + using FunicularSwitch.Transformers; + + namespace FunicularSwitch.Test; + + public record MonadA(A Value) : Monad + { + public static MonadA Return(A a) => throw new NotImplementedException(); + + public MonadA Bind(Func> fn) => throw new NotImplementedException(); + + Monad Monad.Return(B value) => throw new NotImplementedException(); + + Monad Monad.Bind(Func> fn) => throw new NotImplementedException(); + + B Monad.Cast() => throw new NotImplementedException(); + } + + public record MonadB(B Value) + { + public static MonadB Return(B a) => throw new NotImplementedException(); + + public MonadB Bind(Func> fn) => throw new NotImplementedException(); + } + + [MonadTransformer(typeof(MonadB<>))] + public class MonadBT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } + + [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] + public readonly partial record struct MonadAB; + """; + + return Verify(code); + } + + [TestMethod] + public Task WithTransformedMonads() + { + var code = + /*lang=csharp*/ + """ + using System; + using FunicularSwitch.Generators; + using FunicularSwitch.Transformers; + + namespace FunicularSwitch.Test; + + public record MonadA(A Value) + { + public static MonadA Return(A a) => throw new NotImplementedException(); + + public MonadA Bind(Func> fn) => throw new NotImplementedException(); + } + public record MonadB(B Value) + { + public static MonadB Return(B a) => throw new NotImplementedException(); + + public MonadB Bind(Func> fn) => throw new NotImplementedException(); + } + public record MonadC(C Value) + { + public static MonadC Return(C a) => throw new NotImplementedException(); + + public MonadC Bind(Func> fn) => throw new NotImplementedException(); + } + + [MonadTransformer(typeof(MonadB<>))] + public class MonadBT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } + + [MonadTransformer(typeof(MonadC<>))] + public class MonadCT + { + public static Monad> BindT(Monad> ma, Func>> fn) => throw new NotImplementedException(); + } + + [TransformMonad(typeof(MonadA<>), typeof(MonadBT))] + public readonly partial record struct MonadAB; + + [TransformMonad(typeof(MonadAB<>), typeof(MonadCT))] + public readonly partial record struct MonadABC; + """; + + return Verify(code); + } } [TestClass] @@ -630,7 +721,7 @@ namespace FunicularSwitch.Test; [ResultType(typeof(string))] public abstract partial class MonadA; - + [ResultType(typeof(int))] public abstract partial class MonadB; @@ -646,4 +737,4 @@ public class MonadBT return Verify(code); } -} \ No newline at end of file +}