#!/bin/bash (source) function Break_Into_Array() { local colonlist="$1" local arrayname="$2" local delimiter="$3" eval `echo "$colonlist" | sed 's/^/'"$arrayname"'=("/;s/'"$delimiter"'/" "/g;s/$/")/'` } function List_To_Array() { local option="$1" local array="$2" local i for i in `seq $optionsListSize` do if [ "$option" = "${optionsShortList[i]}" -o "$option" = "${optionsLongList[i]}" ] then value="${optionsStateList[i]}" if [ "$value" = "#@unset@#" ] then return 1 else Break_Into_Array "$value" "$array" ":" return 0 fi fi done return 2 } # this is similar to Get_Token, \n is default separator function String_To_Array() { local arrayname rest sep Parameters "$@" arrayname rest sep [ "$sep" ] || sep=$'\n' local i=0 eval "$arrayname"'=()' while [ "$rest" ] do start="${rest%%$sep*}" eval "$arrayname[$i]=\"$start\"" rest="${rest:${#start}}" if [ "$rest" ] then rest=${rest#$sep} let i++ [ "$rest" ] || eval "$arrayname[$i]=" fi done } function For_Each() { local arrayname="$1" local lambda="$2" eval ' for each in "${'"$arrayname"'[@]}" do '"$lambda"' done ' } function For_Each_Reverse() { local arrayname="$1" local lambda="$2" eval ' for index in `seq $(( ${#'"$arrayname"'[@]}-1 )) -1 0` do each="${'"$arrayname"'[index]}" '"$lambda"' done ' } # Usage: Zip lambda array1 var1 array2 var2 array3 var3 ... function Zip() { local lambda="$1" shift 1 arrayname="$1" eaches= while [ "$1" ] do eaches="$eaches $2="'"${'"$1"'[index]}";' shift 2 done eval ' for index in `seq 0 $(( ${#'"$arrayname"'[@]} - 1 ))` do '"$eaches"' '"$lambda"' done ' } function Map() { local fun="$1" shift while [ $# -gt 0 ] do $fun "$1" shift done } function Append_To_Array() { local arrayname="$1" local length=`eval echo '${#'"$arrayname"'[@]}'` local i shift for i in $(seq $length $(($length+$#-1))) do eval "$arrayname[$i]=\"$1\"" shift done } function Remove_From_Array() { local arrayname="$1" local element shift while [ $# -gt 0 ] do element=$1 eval ' for i in `seq 0 $(( ${#'"$arrayname"'[@]}-1 ))` do if [ "${'"$arrayname"'[i]}" = "'"$element"'" ] then unset '"$arrayname"'[i] fi done '"$arrayname"'=(${'"$arrayname"'[@]}) ' shift done } function Combine_Arrays() { merge="$1=(" shift while [ "$1" ] do eval '[ -n "${'$1'[*]}" ] && merge=$merge'\'' "${'$1'[@]}" '\' shift done merge=$merge")" echo "$merge" } function Array_Contains() { local arrayname="$1" local element="$2" local each eval ' for each in ${'"$arrayname"'[@]} do if [ "$each" = "'"$element"'" ] then return 0 fi done return 1 ' } function Array_Intersect() { local array1name="$1" local array2name="$2" local each eval ' for each in ${'"$array1name"'[@]} do if Array_Contains "'"$array2name"'" "$each"; then echo "$each" fi done return 0 ' }