rec {
#############################################################################
# Helpers
# Source: https://github.com/NixOS/nixpkgs/blob/d61bc96d16ca288c69b798b8e31eca64050098e3/lib/lists.nix
foldr = op: nul: list:
let
len = builtins.length list;
fold' = n:
if n == len
then nul
else op (builtins.elemAt list n) (fold' (n + 1));
in
fold' 0;
concatMap = op: list:
concat = (a: b: op a + b);
foldr concat "" list;
############################################################################
# Configs
optional = cond: val:
def =
if builtins.isList val then [ ]
else if builtins.isString val then ""
else null;
if cond then val else def;
# Lua
mkLuaHeredoc = content: ''
lua << EOF
${content}
EOF
'';
mkLuaRc = contents: concatMap mkLuaHeredoc contents;
}