protected override DyObject IterateOp(ExecutionContext ctx, DyObject self) { if (self is IEnumerable <DyObject> seq) { return(DyIterator.Create(seq)); } return(Nil); }
protected override DyObject AddOp(ExecutionContext ctx, DyObject left, DyObject right) { var arr = new List <DyObject>(); arr.AddRange(DyIterator.ToEnumerable(ctx, left)); if (ctx.HasErrors) { return(Nil); } arr.AddRange(DyIterator.ToEnumerable(ctx, right)); if (ctx.HasErrors) { return(Nil); } return(new DyTuple(arr.ToArray())); }
protected override DyObject CastOp(ExecutionContext ctx, DyObject self, DyTypeInfo targetType) { if (targetType.ReflectedTypeId == self.TypeId) { return(self); } var xs = (DyCollection)self; return(targetType.ReflectedTypeId switch { Dy.Tuple => new DyTuple(xs.ToArray()), Dy.Array => new DyArray(xs.ToArray()), Dy.Iterator => DyIterator.Create(xs), Dy.Set => new DySet(new HashSet <DyObject>(xs.ToArray())), _ => base.CastOp(ctx, self, targetType) });
internal static void WriteAllLines(ExecutionContext ctx, string path, DyObject value, int?encoding = null) { var enc = GetEncoding(ctx, encoding); var seq = DyIterator.ToEnumerable(ctx, value).ToArray(); if (ctx.HasErrors) { return; } var strings = seq.Select(s => s.ToString(ctx).Value).ToArray(); if (ctx.HasErrors) { return; } ctx.Handle(() => File.WriteAllLines(path, strings, enc)); }
protected override DyObject GetOp(ExecutionContext ctx, DyObject self, DyObject index) { if (index is not DyInteger ix) { return(ctx.IndexOutOfRange(index)); } var i = (int)ix.Value; try { var iter = DyIterator.ToEnumerable(ctx, self); return(i < 0 ? iter.ElementAt(^ -i) : iter.ElementAt(i)); } catch (ArgumentOutOfRangeException) { ctx.Error = new(DyError.IndexOutOfRange, index); return(Nil); } }
internal static DyObject[] ConcatValues(ExecutionContext ctx, params DyObject[] values) { if (values is null) { return(Array.Empty <DyObject>()); } var arr = new List <DyObject>(); for (var i = 0; i < values.Length; i++) { var seq = DyIterator.ToEnumerable(ctx, values[i]); if (ctx.HasErrors) { break; } arr.AddRange(seq); } return(arr.ToArray()); }
protected override DyObject LengthOp(ExecutionContext ctx, DyObject self) { var seq = DyIterator.ToEnumerable(ctx, self); return(ctx.HasErrors ? Nil : DyInteger.Get(seq.Count())); }
protected override DyObject AddOp(ExecutionContext ctx, DyObject left, DyObject right) => DyIterator.Create(Concat(ctx, left, right));
private static DyObject Iterate(ExecutionContext ctx, DyObject self) => DyIterator.Create(((DyClass)self).Fields);