|defv "==?" deffd |deff "=*?" deffd |defvst "==" deffd |deffst "=*" deffd |defvc "==:" deffd |deffc "=*:" deffd "}" | { { =*f ==x { x f } } quoted { } { * } ? * } ; "}_" defq { { -01 < ==o { o -01 }' "." | ; > -12 } } { quoted { }" { * }" ? * quoted { |deffst } { deffst }" ? * }" ; /via defq { -1110 ; ==f =*a len _ { 0 a 1 -102 range f each }' { "fold on empty array" die }' ? * } /fold deffd { _ =*a len [ 1 -1202 1 add range { -110 sub a -01 }' each -- ] # TODO: rethink this one, seems overly complicated } /reverse deffd { _ len { |or fold }' { -- 0 }' ? * }' /any deffd { _ len { |and fold }' { -- 1 }' ? * }' /all deffd { =*?p { [ -01 { _ p { } { -- } ? * } each ] } } /engrep deffd { engrep * } /grep deffd { -110 ; engrep |dom -20*1* } /indices deffd { =*p _ =*a len ==l 1 neg ==r 0 { _ l lt 1 neg r eq and } { _ a p { _ =r } { } ? * 1 add } loop -- r } /index deffd { not { "Assertion failure" die } rep } /assert deffd { ==s [ s keys { s -01 . }' each ] } /values deffd { _ =*conds len ==max 0 ==i { i max lt }" { i conds * { i 1 add conds * max =i }" { }" ? * i 2 add =i }" loop } /conds deffd { -1010 gt -021 ? }' /max deffd { -1010 lt -021 ? }' /min deffd # vim: syn=elymas