From 00efa2d01a8faae09b712f0490f30a673622cfb5 Mon Sep 17 00:00:00 2001 From: TheFGFSEagle <thefgfseagle@gmail.com> Date: Fri, 3 Feb 2023 23:16:35 +0100 Subject: [PATCH] Make std.algorithm conditions more efficient --- Nasal/std/algorithm.nas | 70 ++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/Nasal/std/algorithm.nas b/Nasal/std/algorithm.nas index 990a1b092..4c6dbc5d7 100644 --- a/Nasal/std/algorithm.nas +++ b/Nasal/std/algorithm.nas @@ -7,14 +7,22 @@ var all = func(obj, key=nil) { return 0; } var res = 1; - foreach (var o; obj) { - if (key) { - res &= key(o); - } else { - res &= o; + if (key) { + if (!isfunc(key)) { + die("std.all got a non-callable 'key' argument"); } - if (res == 0) { - break; + foreach (var o; obj) { + res &= key(o); + if (res == 0) { + break; + } + } + } else { + foreach(var o; obj) { + res &= o; + if (res == 0) { + break; + } } } return res; @@ -22,37 +30,55 @@ var all = func(obj, key=nil) { var any = func(obj, key=nil) { var res = 0; - foreach (var o; obj) { - if (key) { + if (key) { + if (!isfunc(key)) { + die("std.any got a non-callable 'key' argument"); + } + foreach (var o; obj) { res |= key(o); - } else { + if (res == 1) { + break; + } + } + } else { + foreach(var o; obj) { res |= o; - } - if (res == 1) { - break; + if (res == 1) { + break; + } } } return res; }; -var map = func(f, obj) { +var map = func(function, obj) { + if (!isfunc(function)) { + die("std.map got a non-callable 'function' argument"); + } var res = []; foreach (var o; obj) { - append(res, f(o)); + append(res, function(o)); } return res; }; -var filter = func(f, obj) { +var filter = func(function, obj) { var res = []; - foreach (var o; obj) { - if (f) { - if (f(o)) { + if (function) { + if (!isfunc(function)) { + die("std.filter got a non-callable 'function' argument"); + } + foreach (var o; obj) { + if (function(o)) { + append(res, o); + } + } + } elsif (o) { + foreach (var o; obj) { + if (o) { append(res, o); } - } elsif (o) { - append(res, o); } } return res; -}; \ No newline at end of file +};