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"); }
public WhileGenerator(WhileExecute whileExecute) : base(whileExecute) { blockGenerator = whileExecute.block.GetGenerator(); predicate = whileExecute.predicate; region = new Region(); }
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); } }
public FlatGenerator(INSGenerator sourceGenerator) : base(null) { this.sourceGenerator = sourceGenerator; iterators = new MaybeQueue <NSIterator>(); currentIterator = none <NSIterator>(); }
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); }
public LambdaGenerator(Lambda lambda) : base(lambda) { region = lambda.region; sharedRegion = lambda.sharedRegion; block = lambda.block.GetGenerator(); objectRegion = lambda.ObjectRegion; }
public static INSGenerator ReplaceGeneratorSource(INSGenerator originalGenerator, int length) { if (originalGenerator.GeneratorSource is IRangeEndpoints nsIntRange) { return(new NSGenerator(new NSIntRangeByLength(nsIntRange, length))); } return(originalGenerator); }
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)); }
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; }
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); }
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()); }
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); }
public Junction(INSGenerator generator, Arguments arguments) { this.generator = generator; this.arguments = arguments; }
public NSIteratorByLength(INSGenerator generator, int length) : base(ReplaceGeneratorSource(generator, length)) => this.length = length;
public OneJunction(INSGenerator generator, Arguments arguments) : base(generator, arguments) => found = false;
public static Value IfNot(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new IfNotModifier(arguments));
public AnyJunction(INSGenerator generator, Arguments arguments) : base(generator, arguments) { }
public static Value TakeUntil(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new TakeUntilModifier(arguments));
public static Value SkipWhile(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new SkipWhileModifier(arguments));
public static Value Unique(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new UniqueModifier(arguments));
public static Value NoneOf(INSGenerator generator, Arguments arguments) { var junction = new NoneJunction(generator, arguments); return(junction.Evaluate()); }
public static Value MapIf(INSGenerator generator, Arguments arguments) => new NSGeneratorMod(generator, new MapIfModifier(arguments));
public static Value Flat(INSGenerator generator, Arguments arguments) => new FlatGenerator(generator);
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); }
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); }
public void Add(INSGenerator generator) => generators.Add(generator);
public static Value Reset(INSGenerator generator) { generator.Reset(); return((Value)generator); }