public SkryptObject Sort(SkryptEngine engine, SkryptObject self, SkryptObject[] values) { var m = TypeConverter.ToMethod(values, 0); if (m.Parameters.Count < 2) { engine.ThrowError("Input function must have 2 parameters!"); } ((Array)self).List.Sort((x, y) => { var scope = SkryptMethod.GetPopulatedScope(m, new[] { x, y }); scope.ParentScope = ScopeContext; var r = m.Execute(engine, self, new[] { x, y }, scope); if (r.ReturnObject.ToBoolean()) { return(1); } else { return(-1); } }); return(self); }
public SkryptObject Map(SkryptEngine engine, SkryptObject self, SkryptObject[] values) { var m = TypeConverter.ToMethod(values, 0); var newArray = engine.Create <Array>(((Array)self).List); if (m.GetType() == typeof(SkryptMethod) && m.Parameters.Count != 1) { engine.ThrowError("Input function must have 1 parameter!"); } var scope = SkryptMethod.GetPopulatedScope(m, new[] { new Null() }); scope.ParentScope = engine.CurrentScope; var name = scope.Variables.Keys.First(); for (int i = 0; i < newArray.List.Count; i++) { var x = newArray.List[i]; scope.Variables[name].Value = x; var r = m.Execute(engine, self, new[] { x }, scope); ((Array)self).List[i] = scope.Variables[name].Value; } var iterator = new Dictionary <string, SkryptObject>(((Array)self).Table); foreach (var p in iterator) { var x = p.Value; scope.Variables[name].Value = x; var r = m.Execute(engine, self, new[] { x }, scope); newArray.Table[p.Key] = scope.Variables[name].Value; } return(newArray); }