public static IScpWorkflowBuilder UpdateAndTrack
        (
            IScpWorkflowBuilder builder,
            IReadOnlyList <int> seeds,
            bool mergeWithPrev,
            IScpWorkflowTracker tracker
        )
        {
            IEntity <IScpWorkflow> curWorkflowEntity = builder.Entity;

            foreach (var seed in seeds)
            {
                tracker.TrackItem(curWorkflowEntity.Value);
                curWorkflowEntity = Entity.Make
                                    (
                    guid: curWorkflowEntity.Guid.Add(seed),
                    val: curWorkflowEntity.Value.Step(seed)
                                    );
            }

            return(new ScpWorkflowBuilderImpl(
                       guid: builder.Guid.Add(seeds),
                       inputEntities: InputEntityOptions(builder, mergeWithPrev),
                       entity: curWorkflowEntity,
                       seeds: mergeWithPrev ? builder.Seeds.Concat(seeds).ToList() : seeds.ToList()
                       ));
        }
 public static IReadOnlyDictionary <string, IEntity> InputEntityOptions(IScpWorkflowBuilder builder,
                                                                        bool mergeWithPrev)
 {
     return(mergeWithPrev ?
            builder.InputEntities
         : builder.ToEntityDictionary());
 }
 public static IScpWorkflowBuilder Update
 (
     IScpWorkflowBuilder builder,
     IReadOnlyList <int> seeds,
     bool mergeWithPrev
 )
 {
     return(new ScpWorkflowBuilderImpl(
                guid: builder.Guid.Add(seeds),
                inputEntities: InputEntityOptions(builder, mergeWithPrev),
                entity: seeds.Aggregate
                (
                    builder.Entity,
                    (current, seed) =>
     {
         var newWorkflow = Entity.Make(
             guid: builder.Guid.Add(seed),
             val: current.Value.Step(seed)
             );
         return newWorkflow;
     }
                ),
                seeds: mergeWithPrev?builder.Seeds.Concat(seeds).ToList() : seeds.ToList()
                ));
 }
        public static IReadOnlyDictionary <string, IEntity> ToEntityDictionary(this IScpWorkflowBuilder sorterCompParaPoolWorkflowBuilder)
        {
            var dict = new Dictionary <string, IEntity>();

            dict[SorterCompParaPoolWorkflowParts.AllParts.ToString()] = sorterCompParaPoolWorkflowBuilder.Entity;
            return(dict);
        }