fn empty [container]{ == (count $container) 0 } fn values [container]{ keys $container | each [v]{ put $container[$v] } } fn pvalues [container]{ keys $container | peach [v]{ put $container[$v] } } fn value-of [container k &default=$nil]{ if (has-key $container $k) { put $container[$k] } else { put $default } } fn unzip [container]{ var lkeys lvalues = [] [] keys $container | each [k]{ set lkeys = [(all $lkeys) $k] set lvalues = [(all $lvalues) $container[$k]] } put $lkeys $lvalues } fn zip [lkeys lvalues]{ var ck cv = (count $lkeys) (count $lvalues) var c = $ck if (> $ck $cv) { set c = $cv } var result = [&] range $c | peach [i]{ put [&k=$lkeys[$i] &i=$i] } | peach [e]{ assoc $e v $lvalues[$e[i]] } | each [e]{ set result[$e[k]] = $e[v] } put $result } fn to-map [@argv]{ use ./list var container = (list:to-list $@argv) zip [(range (count $container))] $container } fn to-set [@argv]{ use ./list var m = [&] each [k]{ set m[$k] = $nil } (list:to-list $@argv) put $m } fn mdissoc [container @argv]{ each [k]{ set container = (dissoc $container $k) } $argv put $container } fn massoc [&replace=$true container @argv]{ each [e]{ var k v = $@e if (or $replace (not (has-key $container $k))) { set container[$k] = $v } } $argv put $container } fn add [container key @values]{ use ./list var values = (list:to-list $values) if (has-key $container $key) { set container[$key] = [(all $container[$key]) $@values] } else { set container[$key] = $values } put $container } fn join [container container2]{ keys $container2 | each [k]{ set container[$k] = $container2[$k] } put $container } fn sorted-keys [&reverse=$false &less-than=$nil container]{ keys $container | order &reverse=$reverse &less-than=$less-than } fn sorted-values [&reverse=$false &less-than=$nil container]{ values $container | order &reverse=$reverse &less-than=$less-than }