X-Git-Url: https://git.madduck.net/etc/zsh.git/blobdiff_plain/9a1960b5edade792e0d4d9a8c8e0630e774affc5..5dc4d9aa8c7835d46aeb8afc2123c5e344a58df4:/.zsh/util?ds=sidebyside diff --git a/.zsh/util b/.zsh/util index 6c8970a..9b86536 100644 --- a/.zsh/util +++ b/.zsh/util @@ -2,7 +2,7 @@ # # Miscellaneous utility functions # -# Copyright © 1994–2008 martin f. krafft +# Copyright © 1994–2017 martin f. krafft # Released under the terms of the Artistic Licence 2.0 # # Source repository: http://git.madduck.net/v/etc/zsh.git @@ -12,4 +12,42 @@ is_root() { test ${EUID:?} -eq 0 } +array_prepend() { + local arrayname="$1"; shift + local i + for i; do + eval "typeset -ga $arrayname; $arrayname=(\$i \${$arrayname[@]/\$i})" + done +} + +array_append() { + local arrayname="$1"; shift + local i + for i; do + eval "typeset -ga $arrayname; $arrayname=(\${$arrayname[@]/\$i} \$i)" + done +} + +function trace() { ( eval "set -x; $@"; ) } + +function run_at_most_every() { + local timespec= + case "$1" in + ((#b)([0-9]##)([smhd])) timespec="${match[2]}-${match[1]}";; + (*) + zerror "missing timespec: $@" + return + esac + shift + + local sentinel_dir="${XDG_RUNTIME_DIR:-${TMPDIR:-/tmp}}/run_at_most_once_per" + mkdir --parent "${sentinel_dir}" + local sentinel="${sentinel_dir}/${*//[^[:alnum:]]##/_}_${timespec}" + if test -z ${sentinel}(#qNm${timespec}); then + touch "${sentinel}" + $@ + return $? + fi +} + # vim:ft=zsh