#!/bin/bash typeset -a table_keys typeset -a table_values typeset -a ordered_keys key_count=0 function index-of-key () { local initial=$(($(echo $1 | md5sum | cut -c 18-32 | awk '{print "0x"$1}'))) while [[ ${table_keys[$initial]} && ${table_keys[$initial]} != $1 ]]; do initial=$((initial + 1)) done echo -n $initial } function associate () { local index=$(index-of-key $1) [[ ${table_keys[$index]} ]] || ordered_keys[$((key_count++))]=$index table_keys[$index]=$1 table_values[$index]="$(cat)" } function lookup () { local index=$(index-of-key $1) echo -n "${table_values[$index]}" } function serialize () { echo "#!/bin/bash" echo typeset -a table_keys echo typeset -a table_values echo typeset -a ordered_keys echo key_count=0 echo for key in ${ordered_keys[@]}; do echo "function ${table_keys[$key]} () {" echo "${table_values[$key]}" echo "}" echo done for key in ${ordered_keys[@]}; do echo associate ${table_keys[$key]} "< \$0.temporary" echo "mv \$0.temporary \$0 && chmod u+x \$0" } function edit () { local filename=/tmp/$(md5sum <<<"$0-$1" | awk '{print $1}') lookup $1 > $filename ${VISUAL:-vim} $filename && associate $1 < $filename rm $filename } associate index-of-key < \\\$0.temporary" echo "mv \\\$0.temporary \\\$0 && chmod u+x \\\$0" end associate edit < \$filename \${VISUAL:-vim} \$filename && associate \$1 < \$filename rm \$filename end [[ $(lookup $1) ]] && $* serialize > $0.temporary mv $0.temporary $0 && chmod u+x $0