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
+};