aboutsummaryrefslogtreecommitdiff
path: root/lib/lyaml/functional.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lyaml/functional.lua')
-rw-r--r--lib/lyaml/functional.lua87
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/lyaml/functional.lua b/lib/lyaml/functional.lua
new file mode 100644
index 000000000000..556e9489505a
--- /dev/null
+++ b/lib/lyaml/functional.lua
@@ -0,0 +1,87 @@
+-- Minimal functional programming utilities.
+-- Written by Gary V. Vaughan, 2015
+--
+-- Copyright(C) 2015-2022 Gary V. Vaughan
+--
+-- Permission is hereby granted, free of charge, to any person obtaining
+-- a copy of this software and associated documentation files(the
+-- "Software"), to deal in the Software without restriction, including
+-- without limitation the rights to use, copy, modify, merge, publish,
+-- distribute, sublicense, and/or sell copies of the Software, and to
+-- permit persons to whom the Software is furnished to do so, subject to
+-- the following conditions:
+--
+-- The above copyright notice and this permission notice shall be
+-- included in all copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--- @module lyaml.functional
+
+
+--- `lyaml.null` value.
+-- @table NULL
+local NULL = setmetatable({}, {_type='LYAML null'})
+
+
+--- `lyaml.null` predicate.
+-- @param x operand
+-- @treturn bool `true` if *x* is `lyaml.null`.
+local function isnull(x)
+ return(getmetatable(x) or {})._type == 'LYAML null'
+end
+
+
+--- Callable predicate.
+-- @param x operand
+-- @treturn bool `true` if *x* is a function has a __call metamethod
+-- @usage r = iscallable(x) and x(...)
+local function iscallable(x)
+ if type(x) ~= 'function' then
+ x =(getmetatable(x) or {}).__call
+ end
+ if type(x) == 'function' then
+ return x
+ end
+end
+
+
+--- Compose a function to try each callable with supplied args.
+-- @tparam table fns list of functions to try
+-- @treturn function a new function to call *...* functions, stopping
+-- and returning the first non-nil result, if any
+local function anyof(fns)
+ return function(...)
+ for _, fn in ipairs(fns) do
+ if iscallable(fn) then
+ local r = fn(...)
+ if r ~= nil then
+ return r
+ end
+ end
+ end
+ end
+end
+
+
+--- Return arguments unchanged.
+-- @param ... arguments
+-- @return *...*
+local function id(...)
+ return ...
+end
+
+--- @export
+return {
+ NULL = NULL,
+ anyof = anyof,
+ id = id,
+ iscallable = iscallable,
+ isnull = isnull,
+}