stdlib: Implement filter() and filter-out() functions.
authorRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 20:48:29 +0000 (20:48 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 21:01:00 +0000 (21:01 +0000)
docs/Goalfile.pod
stdlib/prelude.gl
tests/10-function-filter-out.expected [new file with mode: 0644]
tests/10-function-filter-out.gl [new file with mode: 0644]
tests/10-function-filter-out.sh [new file with mode: 0755]
tests/10-function-filter.expected [new file with mode: 0644]
tests/10-function-filter.gl [new file with mode: 0644]
tests/10-function-filter.sh [new file with mode: 0755]

index 85d19ba..9031780 100644 (file)
@@ -46,6 +46,24 @@ For example:
 
 Returns the filename extension.
 
+=head3 filter (pattern, list)
+
+For example:
+
+ filter ("a+", ["a", "b", "ca"]) ⇒ ["a", "ca"]
+
+Filter a list returning only the elements that match the extended
+regular expression C<pattern>.
+
+=head3 filter-out (pattern, list)
+
+For example:
+
+ filter-out ("a+", ["a", "b", "ca"]) ⇒ ["b"]
+
+Filter a list returning only the elements that I<do not> match the
+extended regular expression C<pattern>.
+
 =head3 head (list)
 
 For example:
index e8a96e8..d8e523a 100644 (file)
@@ -59,6 +59,16 @@ pure function wrap (wrapper, xs) = @{
 #----------------------------------------------------------------------
 # Text functions.
 
+# Filter a list by regexp.
+pure function filter (pat, xs) returning strings = @{
+    for f in %xs; do echo "$f"; done | grep -E -- %pat
+}
+
+# Filter out a list by regexp.
+pure function filter-out (pat, xs) returning strings = @{
+    for f in %xs; do echo "$f"; done | grep -v -E -- %pat
+}
+
 # Head of a list.
 pure function head (xs) returning string = @{
     for f in %xs; do
diff --git a/tests/10-function-filter-out.expected b/tests/10-function-filter-out.expected
new file mode 100644 (file)
index 0000000..9d1327a
--- /dev/null
@@ -0,0 +1,4 @@
+b
+
+bbb
+ddd
diff --git a/tests/10-function-filter-out.gl b/tests/10-function-filter-out.gl
new file mode 100644 (file)
index 0000000..904bb30
--- /dev/null
@@ -0,0 +1,23 @@
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test the filter function.
+
+let xs = filter-out ("a+", [ "b", "", "aa", "abc", "bca", "bbb", "ddd" ])
+
+goal all = { for x in %xs; do echo "$x"; done }
diff --git a/tests/10-function-filter-out.sh b/tests/10-function-filter-out.sh
new file mode 100755 (executable)
index 0000000..a550def
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+goals -f 10-function-filter-out.gl > 10-function-filter-out.out
+diff -u 10-function-filter-out.out 10-function-filter-out.expected
+rm 10-function-filter-out.out
diff --git a/tests/10-function-filter.expected b/tests/10-function-filter.expected
new file mode 100644 (file)
index 0000000..f022ad4
--- /dev/null
@@ -0,0 +1,3 @@
+aa
+abc
+bca
diff --git a/tests/10-function-filter.gl b/tests/10-function-filter.gl
new file mode 100644 (file)
index 0000000..f660c2d
--- /dev/null
@@ -0,0 +1,23 @@
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test the filter function.
+
+let xs = filter ("a+", [ "b", "", "aa", "abc", "bca", "bbb", "ddd" ])
+
+goal all = { for x in %xs; do echo "$x"; done }
diff --git a/tests/10-function-filter.sh b/tests/10-function-filter.sh
new file mode 100755 (executable)
index 0000000..f8e1bdb
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+# Goals test.
+# Copyright (C) 2020 Richard W.M. Jones
+# Copyright (C) 2020 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+set -e
+
+goals -f 10-function-filter.gl > 10-function-filter.out
+diff -u 10-function-filter.out 10-function-filter.expected
+rm 10-function-filter.out