コード例 #1
0
ファイル: EFCoreGenerator.cs プロジェクト: Drizin/CodegenCS
 public void AddCSX()
 {
     #region Adding EFCoreGenerator.csx
     var mainProgram = new CodegenTextWriter();
     mainProgram.WriteLine($@"
         class Program
         {{
             static void Main()
             {{
                 //var options = new CodegenCS.DbSchema.Templates.EFCoreGenerator.EFCoreGeneratorOptions(inputJsonSchema: @""{_options.InputJsonSchema}"");
                 var options = Newtonsoft.Json.JsonConvert.DeserializeObject<CodegenCS.DbSchema.Templates.EFCoreGenerator.EFCoreGeneratorOptions>(@""
                     {Newtonsoft.Json.JsonConvert.SerializeObject(_options, Newtonsoft.Json.Formatting.Indented).Replace("\"", "\"\"")}
                 "");
                 var generator = new CodegenCS.DbSchema.Templates.EFCoreGenerator.EFCoreGenerator(options);
                 generator.Generate();
                 generator.Save();
             }}
         }}
     ");
     // Export CS template (for customization)
     // Save with CSX extension so that it doesn't interfere with other existing CSPROJs (which by default include *.cs)
     GeneratorContext[typeof(EFCoreGenerator).Name + ".csx"].WriteLine(
         $"//This file is supposed to be launched using: codegencs run {typeof(EFCoreGenerator).Name}.csx" + Environment.NewLine
         + new StreamReader(typeof(EFCoreGenerator).Assembly.GetManifestResourceStream(typeof(EFCoreGenerator).FullName + ".cs")).ReadToEnd() + Environment.NewLine
         + mainProgram.ToString()
         );
     #endregion
 }
 /// <summary>
 /// An IndentedBlockScope defines the scope of an indented block of text
 /// </summary>
 /// <param name="writer"></param>
 /// <param name="beforeBlock">What to write immediately before the indented block starts (before the line break, yet with outer indentation level)</param>
 /// <param name="afterBlock">What to write immediately after the indented block ends (right after the line break, back with outer indentation level)</param>
 public IndentedBlockScope(CodegenTextWriter writer, string beforeBlock, string afterBlock)
 {
     _writer      = writer;
     _beforeBlock = beforeBlock;
     _afterBlock  = afterBlock;
     StartBlock();
 }
コード例 #3
0
        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");
        }
コード例 #4
0
        private static void WriteToDoList(CodegenTextWriter writer, IEnumerable <TodoItem> todoItems)
        {
            foreach (var item in todoItems)
            {
                writer.WriteLine("- {0}", item.Description);

                if (item.SubTasks.Any())
                {
                    writer.IncreaseIndent();
                    WriteToDoList(writer, item.SubTasks);
                    writer.DecreaseIndent();
                }
            }
        }
コード例 #5
0
 public void Setup()
 {
     _w = new CodegenTextWriter();
 }
コード例 #6
0
 private static void WriteToDoItem(CodegenTextWriter writer, TodoItem item)
 {
     writer.WriteLine($"- {item.Description}");
 }
            private string _afterBlock  = null; // What to write immediately after the indented block ends (right after the line break, back with outer indentation level)
            #endregion

            /// <summary>
            /// An IndentedBlockScope defines the scope of an indented block of text
            /// </summary>
            /// <param name="writer"></param>
            public IndentedBlockScope(CodegenTextWriter writer)
            {
                _writer = writer;
                StartBlock();
            }
コード例 #8
0
        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");
        }
コード例 #9
0
        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");
        }
コード例 #10
0
        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");
        }
コード例 #11
0
ファイル: Builder.cs プロジェクト: chengyimingvb/CYMUni
        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);
        }