From 7274ec886a752a7deca84d92757654a9fa0e057e Mon Sep 17 00:00:00 2001
From: TheFGFSEagle <thefgfseagle@gmail.com>
Date: Wed, 18 Jan 2023 15:27:58 +0100
Subject: [PATCH] Added some utility functions (all, any, map and filter)

---
 .../gui/dialogs/WidgetsFactoryDialog.nas      |  2 +-
 Nasal/std/algorithm.nas                       | 58 +++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 Nasal/std/algorithm.nas

diff --git a/Nasal/canvas/gui/dialogs/WidgetsFactoryDialog.nas b/Nasal/canvas/gui/dialogs/WidgetsFactoryDialog.nas
index f3762a98e..f277f72dc 100644
--- a/Nasal/canvas/gui/dialogs/WidgetsFactoryDialog.nas
+++ b/Nasal/canvas/gui/dialogs/WidgetsFactoryDialog.nas
@@ -148,7 +148,7 @@ var WidgetsFactoryDialog = {
 			m.list.createItem("Item " ~ i);
 		}
 		m.list.listen("selection-changed", func {
-			m.list_selection_label.setText("Selected items: " ~ (string.join(", ", map(func(item) item._text, m.list.getSelectedItems())) or "none"));
+			m.list_selection_label.setText("Selected items: " ~ (string.join(", ", std.map(func(item) item._text, m.list.getSelectedItems())) or "none"));
 		});
 		m.list.setSizeHint([m.list._MAX_SIZE, m.list._MAX_SIZE]);
 		m.list_box.addItem(m.list);
diff --git a/Nasal/std/algorithm.nas b/Nasal/std/algorithm.nas
new file mode 100644
index 000000000..990a1b092
--- /dev/null
+++ b/Nasal/std/algorithm.nas
@@ -0,0 +1,58 @@
+
+# SPDX-FileCopyrightText: (C) 2023 Frederic Croix <thefgfseagle@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+var all = func(obj, key=nil) {
+	if (!size(obj)) {
+		return 0;
+	}
+	var res = 1;
+	foreach (var o; obj) {
+		if (key) {
+			res &= key(o);
+		} else {
+			res &= o;
+		}
+		if (res == 0) {
+			break;
+		}
+	}
+	return res;
+};
+
+var any = func(obj, key=nil) {
+	var res = 0;
+	foreach (var o; obj) {
+		if (key) {
+			res |= key(o);
+		} else {
+			res |= o;
+		}
+		if (res == 1) {
+			break;
+		}
+	}
+	return res;
+};
+
+var map = func(f, obj) {
+	var res = [];
+	foreach (var o; obj) {
+		append(res, f(o));
+	}
+	return res;
+};
+
+var filter = func(f, obj) {
+	var res = [];
+	foreach (var o; obj) {
+		if (f) {
+			if (f(o)) {
+				append(res, o);
+			}
+		} elsif (o) {
+			append(res, o);
+		}
+	}
+	return res;
+};
\ No newline at end of file