Initial commit

This commit is contained in:
Yann Esposito (Yogsototh) 2011-11-03 15:21:08 +01:00
commit 01c4844827
4 changed files with 90 additions and 0 deletions

15
README.md Normal file
View file

@ -0,0 +1,15 @@
# ZSH higher order functions
You can look at [this article<sup>†</sup>](http://yannesposito.com/Scratch/en/blog/Higher-order-function-in-zsh/) to have more informations.
To install just clone it to `~/.zsh/functional` and add
# Load functions
func_reps=( ~/.zsh/functional/src )
for rep in $func_reps; do
fpath=($rep $fpath)
autoload -U $rep/*(:t)
done
to your `.zshrc`

29
src/filter Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env zsh
# usage:
#
# $ baz() { print $1 | grep baz }
# $ filter baz titi bazaar biz
# bazaar
# filter() {
(($#<1)) && {
{
print -- "usage: filter func list"
print
print -- "example:"
print -- ' > baz(){print "$*" | grep baz}'
print -- ' > filter baz titi bazaar biz'
print -- ' bazaar'
} >&2
return 1
}
local predicate=$1
local result
typeset -a result
shift
for elem in $@; do
if eval $predicate $elem >/dev/null; then
result=( $result $elem )
fi
done
print $result
# }

27
src/fold Executable file
View file

@ -0,0 +1,27 @@
#!/usr/bin/env zsh
if (($#<2)) {
{
print -- 'usage: fold function list'
print
print -- 'example:'
print -- ' > bar() { print $(($1 + $2)) }'
print -- ' > fold bar 0 1 2 3 4 5'
print -- ' 15'
} >&2
return 1
}
if (($#<3)) {
print -- $2
return 0
} else {
local acc
local right
local func_name=$1
local init_value=$2
local first_value=$3
shift 3
right=$( fold $func_name $init_value $@ )
acc=$( eval "$func_name $first_value $right" )
print -- $acc
return 0
}

19
src/map Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env zsh
map() {
(($#<1)) && {
print -- "usage: map funcname [list]"
print
print -- 'example:'
print -- ' > foo(){print "x: $1"}'
print -- ' > map foo a b c d'
print -- ' x: a'
print -- ' x: b'
print -- ' x: c'
print -- ' x: d'
return 1
}
local func_name=$1
shift
for elem in $@; print -- $(eval $func_name $elem)
}