use str use ./list use ./map search-type = [ &exact= [m]{ ls $m 2>/dev/null } &match= [m]{ put *$m* } &prefix= [m]{ put $m* } &suffix= [m]{ put *$m } &deep-match= [m]{ put **$m** } &deep-prefix= [m]{ put $m** } &deep-suffix= [m]{ put **$m } ] fn -less [f1 f2]{ var fl1 fl2 = (str:to-lower $f1) (str:to-lower $f2) var c = (str:compare $fl1 $fl2) if (== $c 0) { c = (str:compare $f1 $f2) } put (< $c 0) } fn -get-results [sort result]{ if $sort { keys $result | order $-less~ } else { keys $result } } fn -search [&sort=$false &type=exact @motive]{ var f result = $search-type[$type] [&] if (list:empty $motive) { result = (put * | map:to-set) } else { peach [m]{ try { $f $m | peach [e]{ result[$e] = $nil } } except e { } } $motive } -get-results $sort $result } fn match-files [&sort=$false &type=prefix @motive]{ -search &sort=$sort &type=$type $@motive } fn match-extensions [&sort=$false &type=deep-prefix motive @extensions]{ result = [&] -search &type=$type $motive | peach [f]{ if (list:contains [e]{ str:has-suffix $f .$e } $extensions) { result[$f] = $nil } } -get-results $sort $result }