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