egison-2.3.1: lib/core/array.egi
;;
;; Array.egi
;;
(define $Array
(lambda [$a]
(type
{[<cons ,$key ,$val _> [(Array a)]
{[$arr (if (and (array-range? key arr)
((= a) (array-ref key arr) val))
{[arr]}
{})]}]
[<cons ,$key _ _> [a (Array a)]
{[$arr (if (array-range? key arr)
{[(array-ref key arr) arr]}
{})]}]
[_ [Something]
{[$tgt {[tgt]}]}]
})))
(define $range-to-keys
(lambda $ms
(letrec {[$range-to-keys2
(lambda [$ms]
(match ms (List Integer)
{[<nil> {{}}]
[<cons $n $ns>
(let {[$iss (range-to-keys2 ns)]}
(concat (map (lambda [$i]
(map (lambda [$is] {i @is})
iss))
(between 1 n))))]}))]}
(map collection-to-tuple (range-to-keys2 (tuple-to-collection ms))))))
(define $keys-for-display
(lambda [$mx $my]
(let {[$xs (between 1 mx)]
[$ys (reverse (between 1 my))]}
(map (lambda [$y]
(map (lambda [$x] [x y])
xs))
ys))))
(define $find-from-value
(lambda [$a]
(lambda [$val $arr]
(let {[$keys (array-keys arr)]}
(letrec {[$helper (lambda [$keys]
(if ((= a) (array-ref (car keys) arr) val)
(car key)
(helper (cdr keys))))]}
(helper keys))))))
(define $find-all-from-value
(lambda [$a]
(lambda [$val $arr]
(let {[$keys (array-keys arr)]}
(letrec {[$helper (lambda [$keys $ret]
(match keys (List Something)
{[<nil> ret]
[<cons $key $rest>
(if ((= a) (array-ref key arr) val)
(helper rest {@ret val})
(helper rest ret))]}))]}
(helper keys {}))))))
(define $find-from-value-with-pattern
(lambda [$a]
(lambda [$pat $arr]
(let {[$keys (array-keys arr)]}
(letrec {[$helper (lambda [$keys]
(match (array-ref (car keys) arr) a
{[pat (car keys)]
[_ (helper (cdr keys))]}))]}
(helper keys))))))
(define $find-all-from-value-with-pattern
(lambda [$a]
(lambda [$pat $arr]
(let {[$keys (array-keys arr)]}
(letrec {[$helper (lambda [$keys $ret]
(match keys (List Something)
{[<nil> ret]
[<cons $key $rest>
(match (array-ref key arr) a
{[pat (helper rest {@ret val})]
[_ (helper rest ret)]})]}))]}
(helper keys {}))))))