コード例 #1
0
ファイル: ForExecute.cs プロジェクト: toddcoder/Orange2
        public static string Iterate(INSGenerator generator, Parameters parameters, Block block)
        {
            var iterator = new NSIterator(generator);
            var index    = 0;

            using var popper = new RegionPopper(new Region(), "for");
            popper.Push();
            iterator.Reset();
            for (var i = 0; i < MAX_LOOP; i++)
            {
                index = i;
                var next = iterator.Next();
                if (next.IsNil)
                {
                    break;
                }

                parameters.SetValues(next, i);
                block.Evaluate();
                var signal = Signal();
                if (signal == Breaking || signal == ReturningNull)
                {
                    break;
                }
            }

            return(index == 1 ? "1 iteration" : $"{index} iterations");
        }
コード例 #2
0
ファイル: WhileExecute.cs プロジェクト: toddcoder/Orange
 public WhileGenerator(WhileExecute whileExecute)
     : base(whileExecute)
 {
     blockGenerator = whileExecute.block.GetGenerator();
     predicate      = whileExecute.predicate;
     region         = new Region();
 }
コード例 #3
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange
        public static Value Group(INSGenerator generator, Arguments arguments)
        {
            var count = arguments[0].Int;

            if (count > 0)
            {
                var iterator = new NSIterator(generator);
                var array    = new Array();
                iterator.Reset();
                var value = iterator.Next();
                for (var i = 0; i < MAX_ARRAY && !value.IsNil; i += count)
                {
                    var subArray = new Array();
                    for (var j = 0; j < count && !value.IsNil; j++)
                    {
                        subArray.Add(value);
                        value = iterator.Next();
                    }

                    array.Add(value);
                    value = iterator.Next();
                }

                return(array);
            }

            using (var assistant = new ParameterAssistant(arguments))
            {
                var block = assistant.Block();
                if (block == null)
                {
                    return(ToArray(generator));
                }

                var hash = new AutoHash <string, List <Value> >
                {
                    Default        = DefaultType.Lambda,
                    DefaultLambda  = k => new List <Value>(),
                    AutoAddDefault = true
                };

                assistant.IteratorParameter();
                var iterator = new NSIterator(generator);
                iterator.Reset();
                foreach (var item in iterator)
                {
                    assistant.SetIteratorParameter(item);
                    var key = block.Evaluate().Text;
                    hash[key].Add(item);
                }

                var array = new Array();
                foreach (var item in hash)
                {
                    array[item.Key] = new Array(item.Value);
                }

                return(array);
            }
        }
コード例 #4
0
 public FlatGenerator(INSGenerator sourceGenerator)
     : base(null)
 {
     this.sourceGenerator = sourceGenerator;
     iterators            = new MaybeQueue <NSIterator>();
     currentIterator      = none <NSIterator>();
 }
コード例 #5
0
ファイル: MultiAssign.cs プロジェクト: toddcoder/Orange2
        static Array FromFields(INSGenerator generator, Parameters parameters, bool readOnly, bool setting, bool overriding, Func <Value, Value> map)
        {
            var iterator           = new NSIterator(generator);
            var array              = new Array();
            var start              = 0;
            var actualParameters   = parameters.GetParameters();
            var length             = actualParameters.Length;
            var assignments        = new Hash <string, Value>();
            var assignedParameters = new Hash <string, Parameter>();

            for (var i = start; i < length; i++)
            {
                start = i;
                var parameter = actualParameters[i];
                var value     = iterator.Next();
                if (value.IsNil)
                {
                    break;
                }

                assignments[parameter.Name]        = value;
                assignedParameters[parameter.Name] = parameter;
                array[parameter.Name] = value;
            }

            if (start <= length - 1)
            {
                var innerArray = new Array {
                    array[parameters[start].Name]
                };
                for (var i = start; i < MAX_LOOP; i++)
                {
                    var value = iterator.Next();
                    if (value.IsNil)
                    {
                        break;
                    }

                    innerArray.Add(value);
                }

                if (innerArray.Length > 0)
                {
                    var value = map(innerArray);
                    assignments[parameters[start].Name]        = value;
                    assignedParameters[parameters[start].Name] = parameters[start];
                    array[parameters[start].Name] = value;
                }
            }

            foreach (var(key, value) in assignments)
            {
                if (assignedParameters.If(key, out var parameter))
                {
                    parameter.Assign(value, readOnly, setting, overriding);
                }
            }

            return(array);
        }
コード例 #6
0
 public LambdaGenerator(Lambda lambda)
     : base(lambda)
 {
     region       = lambda.region;
     sharedRegion = lambda.sharedRegion;
     block        = lambda.block.GetGenerator();
     objectRegion = lambda.ObjectRegion;
 }
コード例 #7
0
        public static INSGenerator ReplaceGeneratorSource(INSGenerator originalGenerator, int length)
        {
            if (originalGenerator.GeneratorSource is IRangeEndpoints nsIntRange)
            {
                return(new NSGenerator(new NSIntRangeByLength(nsIntRange, length)));
            }

            return(originalGenerator);
        }
コード例 #8
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
        public static Value First(INSGenerator generator, Arguments arguments)
        {
            var iterator = new NSIterator(generator);

            iterator.Reset();
            var next = iterator.Next();

            return(next.IsNil ? new None() : new Some(next));
        }
コード例 #9
0
ファイル: ForExecute.cs プロジェクト: toddcoder/Orange2
            public ForGenerator(ForExecute forExecute) : base(forExecute)
            {
                parameters      = forExecute.parameters;
                sourceGenerator = forExecute.value.Evaluate().PossibleGenerator().Required("Value is not a generator");
                blockGenerator  = forExecute.block.GetGenerator();

                blockGenerating = false;
                sourceValue     = NilValue;
            }
コード例 #10
0
ファイル: ArrayFromValue.cs プロジェクト: toddcoder/Orange
        static Array fromValue(Value source, INSGenerator count)
        {
            var countSource = (Array)count.Array();
            var array       = new Array();
            var outerCount  = countSource[0].Int;
            var innerCount  = countSource[1].Int;

            for (var i = 0; i < outerCount; i++)
            {
                array.Add(fromValue(source, innerCount));
            }

            return(array);
        }
コード例 #11
0
ファイル: Block.cs プロジェクト: toddcoder/Orange2
            protected IMaybe <Value> evaluateGenerator(INSGenerator generator, int i)
            {
                _currentGenerator = generator.Some();
                generator.Region  = Region;
                generator.Reset();
                var returnValue = generator.Next();

                if (returnValue.IsNil)
                {
                    _currentGenerator = none <INSGenerator>();
                    return(none <Value>());
                }

                index = i + 1;
                return(block.evaluateReturn(returnValue).Some());
            }
コード例 #12
0
ファイル: Runtime.cs プロジェクト: toddcoder/Orange
        public static Array ToArray(INSGenerator generator)
        {
            var array    = new Array();
            var iterator = new NSIterator(generator);

            iterator.Reset();
            for (var i = 0; i < MAX_ARRAY; i++)
            {
                var next = iterator.Next();
                if (next.IsNil)
                {
                    break;
                }

                array.Add(next);
            }

            return(array);
        }
コード例 #13
0
 public Junction(INSGenerator generator, Arguments arguments)
 {
     this.generator = generator;
     this.arguments = arguments;
 }
コード例 #14
0
 public NSIteratorByLength(INSGenerator generator, int length)
     : base(ReplaceGeneratorSource(generator, length)) => this.length = length;
コード例 #15
0
 public OneJunction(INSGenerator generator, Arguments arguments)
     : base(generator, arguments) => found = false;
コード例 #16
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value IfNot(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new IfNotModifier(arguments));
コード例 #17
0
ファイル: AnyJunction.cs プロジェクト: toddcoder/Orange2
 public AnyJunction(INSGenerator generator, Arguments arguments)
     : base(generator, arguments)
 {
 }
コード例 #18
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value TakeUntil(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new TakeUntilModifier(arguments));
コード例 #19
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value SkipWhile(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new SkipWhileModifier(arguments));
コード例 #20
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value Unique(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new UniqueModifier(arguments));
コード例 #21
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
        public static Value NoneOf(INSGenerator generator, Arguments arguments)
        {
            var junction = new NoneJunction(generator, arguments);

            return(junction.Evaluate());
        }
コード例 #22
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value MapIf(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new MapIfModifier(arguments));
コード例 #23
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value Flat(INSGenerator generator, Arguments arguments) => new FlatGenerator(generator);
コード例 #24
0
ファイル: MultiAssign.cs プロジェクト: toddcoder/Orange
        static Array FromFields(INSGenerator generator, Parameters parameters, bool readOnly, bool setting,
                                bool _override, Func <Value, Value> map)
        {
            var iterator           = new NSIterator(generator);
            var array              = new Array();
            var start              = 0;
            var actuals            = parameters.GetParameters();
            var length             = actuals.Length;
            var assignments        = new Hash <string, Value>();
            var assignedParameters = new Hash <string, Parameter>();

            for (var i = start; i < length; i++)
            {
                start = i;
                var parameter = actuals[i];
                var value     = iterator.Next();
                if (value.IsNil)
                {
                    break;
                }

                assignments[parameter.Name]        = value;
                assignedParameters[parameter.Name] = parameter;
                array[parameter.Name] = value;
            }

            if (start <= length - 1)
            {
                var innerArray = new Array {
                    array[parameters[start].Name]
                };
                for (var i = start; i < MAX_LOOP; i++)
                {
                    var value = iterator.Next();
                    if (value.IsNil)
                    {
                        break;
                    }

                    innerArray.Add(value);
                }

                if (innerArray.Length > 0)
                {
                    var value = map(innerArray);
                    assignments[parameters[start].Name]        = value;
                    assignedParameters[parameters[start].Name] = parameters[start];
                    array[parameters[start].Name] = value;
                }
            }

            // ReSharper disable once LoopCanBePartlyConvertedToQuery
            foreach (var item in assignments)
            {
                if (assignedParameters.If(item.Key, out var parameter))
                {
                    parameter.Assign(item.Value, readOnly, setting, _override);
                }
            }

            return(array);
        }
コード例 #25
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
        public static Value FoldL(INSGenerator generator, Arguments arguments)
        {
            var iterator = new NSIterator(generator);

            using var assistant = new ParameterAssistant(arguments);
            var block = assistant.Block();

            if (block == null)
            {
                return(NilValue);
            }

            iterator.Reset();

            assistant.TwoValueParameters();
            var initialFromArguments = arguments[0];
            var initialValue         = initialFromArguments.IsEmpty ? iterator.Next() : initialFromArguments;

            if (initialValue.IsNil)
            {
                return(initialValue);
            }

            var secondValue = iterator.Next();

            if (secondValue.IsNil)
            {
                return(initialValue);
            }

            assistant.SetParameterValues(initialValue, secondValue);
            var value  = block.Evaluate();
            var signal = Signal();

            if (signal == Breaking)
            {
                return(value);
            }

            switch (signal)
            {
            case ReturningNull:
                return(null);

            case Continuing:
                return(value);
            }

            var next = iterator.Next();

            if (next.IsNil)
            {
                return(value);
            }

            for (var i = 0; i < MAX_LOOP; i++)
            {
                assistant.SetParameterValues(value, next);
                value  = block.Evaluate();
                signal = Signal();
                if (signal == Breaking)
                {
                    break;
                }

                switch (signal)
                {
                case ReturningNull:
                    return(null);

                case Continuing:
                    continue;
                }

                next = iterator.Next();
                if (next.IsNil)
                {
                    return(value);
                }
            }

            return(value);
        }
コード例 #26
0
 public void Add(INSGenerator generator) => generators.Add(generator);
コード例 #27
0
ファイル: NSGenerator.cs プロジェクト: toddcoder/Orange2
 public static Value Reset(INSGenerator generator)
 {
     generator.Reset();
     return((Value)generator);
 }