public void TestCBlockFluentAPI() { _w .WriteLine("// will open a C block") .WithCBlock("void MyMethod()", () => { _w.WriteLine("int i = 0;"); }); Assert.AreEqual(expected_C, _w.ToString()); }
private static void Apply() { var w = new CodegenTextWriter(); for (var i = 2; i <= Number; i++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i} parameter functions."); w.WriteLine($"// ------------------------"); //public static Func<IResult<T2>, IResult> Apply<T1, T2>( // this Func<IResult<T1>, IResult<T2>, IResult> source, T1 rt1) => // rt2 => source(Success(rt1), rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, IResult> Apply<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, IResult> source, T1 rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(Success(rt1), {Rts(2, i - 1)});"); w.WriteLine(); //public static Func<IResult<T2>, IResult<T3>> Apply<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>, IResult<T3>> source, T1 rt1) => // rt2 => source(Success(rt1), rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i)}> Apply<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i + 1)}> source, T1 rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(Success(rt1), {Rts(2, i - 1)});"); w.WriteLine(); //public static Func<IResult<T2>, IResult> Apply<T1, T2>( // this Func<IResult<T1>, IResult<T2>, IResult> source, IResult<T1> rt1) => // rt2 => source(rt1, rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, IResult> Apply<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, IResult> source, IResult<T1> rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source({Rts(1, i)});"); w.WriteLine(); //public static Func<IResult<T2>, IResult<T3>> Apply<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>, IResult<T3>> source, IResult<T1> rt1) => // (rt2) => source(rt1, rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i)}> Apply<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i + 1)}> source, IResult<T1> rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source({Rts(1, i)});"); w.WriteLine(); //public static Func<IResult<T2>, Task<IResult>> ApplyAsync<T1, T2>( // this Func<IResult<T1>, IResult<T2>, Task<IResult>> source, T1 rt1) => // rt2 => source(Success(rt1), rt2); w.WriteLine($"/// Apply the first value to a {i} parameter async function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, Task<IResult>> ApplyAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, Task<IResult>> source, T1 rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(Success(rt1), {Rts(2, i - 1)});"); w.WriteLine(); //public static Func<IResult<T2>, Task<IResult<T3>>> ApplyAsync<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>, Task<IResult<T3>>> source, T1 rt1) => // rt2 => source(Success(rt1), rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, Task<{IResultT(i + 1, 1)}>> ApplyAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, Task<{IResultT(i + 1, 1)}>> source, T1 rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(Success(rt1), {Rts(2, i - 1)});"); w.WriteLine(); //public static Func<IResult<T2>, Task<IResult>> ApplyAsync<T1, T2>( // this Func<IResult<T1>, IResult<T2>, Task<IResult>> source, IResult<T1> rt1) => // rt2 => source(rt1, rt2); w.WriteLine($"/// Apply the first value to a {i} parameter async function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, Task<IResult>> ApplyAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, Task<IResult>> source, IResult<T1> rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(rt1, {Rts(2, i - 1)});"); w.WriteLine(); //public static Func<IResult<T2>, Task<IResult<T3>>> ApplyAsync<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>, Task<IResult<T3>>> source, IResult<T1> rt1) => // rt2 => source(rt1, rt2); w.WriteLine($"/// Apply the first value to a {i} parameter function."); w.WriteLine($"public static Func<{IResultT(2, i - 1)}, Task<{IResultT(i + 1, 1)}>> ApplyAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}, Task<{IResultT(i + 1, 1)}>> source, IResult<T1> rt1) =>"); w.WriteLine($"{Tab}({Rts(2, i - 1)}) => source(rt1, {Rts(2, i - 1)});"); w.WriteLine(); } w.SaveToFile("Apply.cs"); }
private static void ResultComputation() { var w = new CodegenTextWriter(); for (var i = 2; i <= Number; i++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i} parameter functions."); w.WriteLine($"// ------------------------"); w.WriteLine($"public class ResultComputation<{Ts(1, i)}> : IResult"); w.WriteLine($"{{"); w.WriteLine(Fields(i)); w.WriteLine(); w.WriteLine($"internal ResultComputation({IResultTParams(i)})"); w.WriteLine($"{{"); w.WriteLine($"{FieldsAssignment(i)}"); w.WriteLine($"}}"); w.WriteLine(); w.WriteLine($"public bool IsSuccess => {IsSuccess(i)};"); w.WriteLine($"public IEnumerable<string> Errors => ({Errors(i)});"); w.WriteLine(); w.WriteLine($"public IResult Bind(Func<{Ts(1, i)}, IResult> f) =>"); w.WriteLine($"{Tab}Lift(f){Apply(i)};"); w.WriteLine(); w.WriteLine($"public Task<IResult> BindAsync(Func<{Ts(1, i)}, Task<IResult>> f) =>"); w.WriteLine($"{Tab}LiftAsync(f){ApplyAsync(i)};"); w.WriteLine(); w.WriteLine($"public IResult<T{i + 1}> Bind<T{i + 1}>(Func<{Ts(1, i)}, IResult<{Ts(i + 1, 1)}>> f) =>"); w.WriteLine($"{Tab}Lift(f){Apply(i)};"); w.WriteLine(); w.WriteLine($"public Task<IResult<T{i + 1}>> BindAsync<T{i + 1}>(Func<{Ts(1, i)}, Task<IResult<T{i + 1}>>> f) =>"); w.WriteLine($"{Tab}LiftAsync(f){ApplyAsync(i)};"); w.WriteLine(); w.WriteLine($"public IResult<T{i + 1}> Map<T{i + 1}>(Func<{Ts(1, i + 1)}> f) =>"); w.WriteLine($"{Tab}Lift(f){Apply(i)};"); w.WriteLine(); w.WriteLine($"public Task<IResult<T{i + 1}>> MapAsync<T{i + 1}>(Func<{Ts(1, i)}, Task<T{i + 1}>> f) =>"); w.WriteLine($"{Tab}LiftAsync(f){ApplyAsync(i)};"); w.WriteLine(); w.WriteLine($"public IResult Map(Action<{Ts(1, i)}> f) =>"); w.WriteLine($"{Tab}Lift(f){Apply(i)};"); w.WriteLine(); w.WriteLine($"public Task<IResult> MapAsync(Func<{Ts(1, i)}, Task> f) =>"); w.WriteLine($"{Tab}LiftAsync(f){ApplyAsync(i)};"); w.WriteLine($"}}"); w.WriteLine(); w.WriteLine($"public static partial class ResultComputation"); w.WriteLine($"{{"); w.WriteLine($"public static ResultComputation<{Ts(1, i)}> Create<{Ts(1, i)}>({IResultTParams(i)}) =>"); w.WriteLine($"{Tab}new ResultComputation<{Ts(1, i)}>({Letters(i)});"); w.WriteLine($"}}"); w.WriteLine(); } w.SaveToFile("ResultComputation.cs"); }
private static void Bind() { var w = new CodegenTextWriter(); for (var i = 2; i <= Number + 1; i++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i - 1} parameter functions."); w.WriteLine($"// ------------------------"); w.WriteLine(); //public static Func<IResult<T1>, IResult> Bind<T1, T2>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, IResult> f) => // rt1 => source(rt1).Bind(f); w.WriteLine($"/// Chains the previous function to another function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, IResult> Bind<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}> source, Func<T{i}, IResult> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).Bind(f);"); w.WriteLine(); //public static Func<IResult<T1>, IResult<T3>> Bind<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, IResult<T3>> f) => // rt1 => source(rt1).Bind(f); w.WriteLine($"/// Chains the previous function to another function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultT(i + 1, 1)}> Bind<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}> source, Func<T{i}, {IResultT(i + 1, 1)}> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).Bind(f);"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult>> BindAsync<T1, T2>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, Task<IResult>> f) => // rt1 => source(rt1).BindAsync(f); w.WriteLine($"/// Chains the previous function to an async function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, Task<IResult>> BindAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}> source, Func<T{i}, Task<IResult>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).BindAsync(f);"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult<T3>>> BindAsync<T1, T2, T3>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, Task<IResult<T3>>> f) => // rt1 => source(rt1).BindAsync(f); w.WriteLine($"/// Chains the previous function to an async function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, Task<{IResultT(i + 1, 1)}>> BindAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i)}> source, Func<T{i}, Task<{IResultT(i + 1, 1)}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).BindAsync(f);"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult>> BindAsync<T1, T2>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, IResult> f) => // rt1 => source(rt1).BindAsync(f); w.WriteLine($"/// Chains the previous async function to another function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, Task<{IResultT(i + 1, 1)}>> BindAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, Task<{IResultT(i + 1, 1)}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).BindAsync(f);"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult>> BindAsync<T1, T2>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, IResult> f) => // rt1 => source(rt1).BindAsync(f); w.WriteLine($"/// Chains the previous async function to another async function."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, Task<IResult>> BindAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, Task<IResult>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}) => source({Rts(1, i - 1)}).BindAsync(f);"); w.WriteLine(); for (var j = 1; j <= InnerNumber; j++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i - 1} parameter functions. Capturing {j} additional parameters."); w.WriteLine($"// ------------------------"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, IResult> Bind<T1, T2, TInner1>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, TInner1, IResult> f) => // (rt1, rt2) => source(rt1).Bind(x => Result.Lift(f).Apply(x).Apply(rt2)); w.WriteLine($"/// Chains the previous function to another function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, IResult> Bind<{Ts(1, i)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, {IResultT(i, 1)}> source, Func<T{i}, {TInners(1, j)}, IResult> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).Bind(x => Result.Lift(f).Apply(x){ApplyRts(i, j)});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, IResult<T3>> Bind<T1, T2, T3, TInner1>( // this Func<IResult<T1>, IResult<T2>> source, Func<T2, TInner1, IResult<T3>> f) => // (rt1, rt2) => source(rt1).Bind(x => Result.Lift(f).Apply(x).Apply(rt2)); w.WriteLine($"/// Chains the previous function to another function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, IResult<T{i + 1}>> Bind<{Ts(1, i + 1)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, {IResultT(i, 1)}> source, Func<T{i}, {TInners(1, j)}, IResult<T{i + 1}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).Bind(x => Result.Lift(f).Apply(x){ApplyRts(i, j)});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, Task<IResult>> BindAsync<T1, T2, TInner1>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, TInner1, IResult> f) => // (rt1, rt2) => source(rt1).BindAsync(x => Result.Lift(f).Apply(x).Apply(rt2)); w.WriteLine($"/// Chains the previous async function to another function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, Task<IResult>> BindAsync<{Ts(1, i)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, {TInners(1, j)}, IResult> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).BindAsync(x => Result.Lift(f).Apply(x){ApplyRts(i, j)});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, Task<IResult<T3>>> BindAsync<T1, T2, T3, TInner1>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, TInner1, IResult<T3>> f) => // (rt1, rt2) => source(rt1).BindAsync(x => Result.Lift(f).Apply(x).Apply(rt2)); w.WriteLine($"/// Chains the previous async function to another function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, Task<IResult<T{i + 1}>>> BindAsync<{Ts(1, i+1)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, {TInners(1, j)}, IResult<T{i + 1}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).BindAsync(x => Result.Lift(f).Apply(x){ApplyRts(i, j)});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, Task<IResult>> BindAsync<T1, T2, TInner1>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, TInner1, Task<IResult>> f) => // (rt1, rt2) => source(rt1).BindAsync(x => Result.LiftAsync(f).ApplyAsync(x).ApplyAsync(rt2)); w.WriteLine($"/// Chains the previous async function to another async function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, Task<IResult>> BindAsync<{Ts(1, i)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, {TInners(1, j)}, Task<IResult>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).BindAsync(x => Result.LiftAsync(f).ApplyAsync(x){ApplyRtsAsync(i, j)});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<TInner1>, Task<IResult<T3>>> BindAsync<T1, T2, T3, TInner1>( // this Func<IResult<T1>, Task<IResult<T2>>> source, Func<T2, TInner1, Task<IResult<T3>>> f) => // (rt1, rt2) => source(rt1).BindAsync(x => Result.LiftAsync(f).ApplyAsync(x).ApplyAsync(rt2)); w.WriteLine($"/// Chains the previous async function to another async function with {j} additional parameters."); w.WriteLine($"public static Func<{IResultT(1, i - 1)}, {IResultTInner(1, j)}, Task<IResult<T{i + 1}>>> BindAsync<{Ts(1, i + 1)}, {TInners(1, j)}>("); w.WriteLine($"{Tab}this Func<{IResultT(1, i - 1)}, Task<{IResultT(i, 1)}>> source, Func<T{i}, {TInners(1, j)}, Task<IResult<T{i + 1}>>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i - 1)}, {Rts(i, j)}) => source({Rts(1, i - 1)}).BindAsync(x => Result.LiftAsync(f).ApplyAsync(x){ApplyRtsAsync(i, j)});"); w.WriteLine(); } } w.SaveToFile("Bind.cs"); }
private static void Lift() { var w = new CodegenTextWriter(); w.WriteLine($"// ------------------------"); w.WriteLine($"// Mergers."); w.WriteLine($"// ------------------------"); for (var i = 1; i < Number + 1; i++) { //private static IResult<(T1, T2)> Merge<T1, T2>( // IResult<T1> fst, IResult<T2> snd) => // Sequence(fst, snd).Map(() => (fst.ItemOrDefault, snd.ItemOrDefault)); if (i == 1) { w.WriteLine($"private static IResult<{Ts(1, i)}> Merge<{Ts(1, i)}>("); } else { w.WriteLine($"private static IResult<({Ts(1, i)})> Merge<{Ts(1, i)}>("); } w.WriteLine($"{Tab}{IResultTParams(i)}) =>"); w.WriteLine($"{Tab}Sequence({Letters(i)}).Map(() => ({Items(i)}));"); w.WriteLine(); } w.WriteLine($"// ------------------------"); w.WriteLine($"// Lift Bind"); w.WriteLine($"// ------------------------"); w.WriteLine(); for (var i = 1; i < Number + 1; i++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i} parameter functions."); w.WriteLine($"// ------------------------"); //public static Func<IResult<T1>, IResult<T2>, IResult> Lift<T1, T2>( // Func<T1, T2, IResult> func) => // (rt1, rt2) => Binder(Merge(rt1, rt2), x => func(x.Item1, x.Item2)); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, IResult> Lift<{Ts(1, i)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, IResult> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => Binder(Merge({Rts(1, i)}), x => f({TupleItems(i)}));"); w.WriteLine(); //public static Func<IResult<T1>, IResult<T2>, IResult<T3>> Lift<T1, T2, T3>( // Func<T1, T2, IResult<T3>> func) => // (rt1, rt2) => Binder(Merge(rt1, rt2), x => func(x.Item1, x.Item2)); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i + 1)}> Lift<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, {IResultT(i + 1, 1)}> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => Binder(Merge({Rts(1, i)}), x => f({TupleItems(i)}));"); w.WriteLine(); //public static Func<IResult<T1>, IResult<T2>, Task<IResult>> LiftAsync<T1, T2>( // Func<T1, T2, Task<IResult>> func) => // (rt1, rt2) => Binder(Merge(rt1, rt2), x => func(x.Item1, x.Item2)); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, Task<IResult>> LiftAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, Task<IResult>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => BinderAsync(Merge({Rts(1, i)}), x => f({TupleItems(i)}));"); w.WriteLine(); //public static Func<IResult<T1>, IResult<T2>, Task<IResult<T3>>> Lift<T1, T2, T3>( // Func<T1, T2, Task<IResult<T3>>>> func) => // (rt1, rt2) => Binder(Merge(rt1, rt2), x => func(x.Item1, x.Item2)); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, Task<{IResultT(i + 1, 1)}>> LiftAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, Task<{IResultT(i + 1, 1)}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => BinderAsync(Merge({Rts(1, i)}), x => f({TupleItems(i)}));"); w.WriteLine(); } w.WriteLine($"// ------------------------"); w.WriteLine($"// Lift Map"); w.WriteLine($"// ------------------------"); w.WriteLine(); for (var i = 1; i < Number + 1; i++) { w.WriteLine($"// ------------------------"); w.WriteLine($"// {i} parameter functions."); w.WriteLine($"// ------------------------"); //public static Func<IResult<T1>, IResult> Lift<T1>( // Action<T1> f) => // (rt1) => Binder(Merge(rt1), x => { f(x); return Success(); }); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, IResult> Lift<{Ts(1, i)}>("); w.WriteLine($"{Tab}Action<{Ts(1, i)}> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => Binder(Merge({Rts(1, i)}), x => {{ f({TupleItems(i)}); return Success(); }});"); w.WriteLine(); //public static Func<IResult<T1>, IResult<T2>> Lift<T1, T2>( // Func<T1, T2> f) => // rt1 => Binder(Merge(rt1), x => Success(f(x))); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i + 1)}> Lift<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i + 1)}> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => Binder(Merge({Rts(1, i)}), x => Success(f({TupleItems(i)})));"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult>> LiftAsync<T1>( // Func<T1, Task> f) => // (rt1) => BinderAsync(Merge(rt1), async x => { await f(x); return Success(); }); w.WriteLine($"/// Lifts an async function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, Task<IResult>> LiftAsync<{Ts(1, i)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, Task> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => BinderAsync(Merge({Rts(1, i)}), async x => {{ await f({TupleItems(i)}); return Success(); }});"); w.WriteLine(); //public static Func<IResult<T1>, Task<IResult<T2>>> LiftAsync<T1, T2>( // Func<T1, T2> f) => // rt1 => Binder(Merge(rt1), x => Success(f(x))); w.WriteLine($"/// Lifts a function into a function that inputs and outputs results."); w.WriteLine($"public static Func<{IResultT(1, i)}, Task<{IResultT(i + 1, 1)}>> LiftAsync<{Ts(1, i + 1)}>("); w.WriteLine($"{Tab}Func<{Ts(1, i)}, Task<T{i + 1}>> f) =>"); w.WriteLine($"{Tab}({Rts(1, i)}) => BinderAsync(Merge({Rts(1, i)}), async x => Success(await f({TupleItems(i)})));"); w.WriteLine(); } w.SaveToFile("Lift.cs"); }
static void BuildDLCConfigInternal(DLCItem dlcItem) { var builds = AssetBundleBuildsCache = GenerateAssetBundleBuildData(dlcItem); string constPath = dlcItem.GetConst(); string manifestPath = dlcItem.GetManifest(); string dlcItemPath = dlcItem.GetConfig(); List <string> bundles = new List <string>(); List <string> assets = new List <string>(); if (builds.Count > 0) { foreach (var item in builds) { bundles.Add(item.assetBundleName); foreach (var assetPath in item.assetNames) { assets.Add(assetPath + ":" + (bundles.Count - 1)); } } } #region 创建Manifest文件 if (File.Exists(manifestPath)) { File.Delete(manifestPath); } DLCManifest dlcManifest = new DLCManifest(); foreach (var item in builds) { BundleData tempData = new BundleData(); tempData.DLCName = dlcItem.Name; if (AllBundles.ContainsKey(item.assetBundleName)) { tempData.BundleName = item.assetBundleName; if (AllSharedBundles.Contains(item.assetBundleName)) { tempData.IsShared = true; } } else { CLog.Error("没有包含:" + item.assetBundleName); } foreach (var asset in item.assetNames) { AssetPathData pathData = new AssetPathData(); pathData.FullPath = asset; pathData.FileName = Path.GetFileNameWithoutExtension(asset); if (AllAssets.ContainsKey(asset)) { pathData.SourceBundleName = AllAssets[asset]; } tempData.AssetFullPaths.Add(pathData); } dlcManifest.Data.Add(tempData); } FileUtil.SaveJson(manifestPath, dlcManifest, true); #endregion #region dlcitem if (File.Exists(dlcItemPath)) { File.Delete(dlcItemPath); } FileUtil.SaveJson(dlcItemPath, dlcItem.Config, true); #endregion #region const if (File.Exists(constPath)) { File.Delete(constPath); } var cultureInfo = new System.Globalization.CultureInfo("en-us"); var w = new CodegenTextWriter(constPath, System.Text.Encoding.UTF8); w.WithCurlyBraces("namespace CYM", () => { w.WithCurlyBraces("public partial class Const", () => { foreach (var bundleData in dlcManifest.Data) { string newBundleName = ""; foreach (var pathData in bundleData.AssetFullPaths) { if (pathData.SourceBundleName.IsInv()) { continue; } //跳过指定的Bundle资源 if (pathData.SourceBundleName == Const.BN_System || pathData.SourceBundleName == Const.BN_Shared) { continue; } //获得相应的Bundle名称 if (pathData.SourceBundleName.StartsWith(Const.BN_Scene)) { newBundleName = Const.BN_Scene; } else { newBundleName = pathData.SourceBundleName; } //保证变量名称有效 var fileName = pathData.FileName.Replace(".", "_").Replace("(", "_").Replace(")", "").Trim(); //加上前缀 fileName = newBundleName.ToUpper() + "_" + fileName; //忽略不需要的Const if (DLCConfig.IsInIgnoreConst(fileName)) { continue; } if (Consts.Contains(fileName)) { continue; } Consts.Add(fileName); w.WriteLine($"public const string {fileName} = \"{pathData.FileName}\";"); } } }); }); w.Flush(); w.Dispose(); #endregion CLog.Info("[Builder][{0}] BuildManifest with " + assets.Count + " assets and " + bundles.Count + " bundels.", dlcItem.Name); }