packages feed

egison-3.9.0: lib/core/assoc.egi

;;;;;
;;;;;
;;;;; Assoc-Collection
;;;;;
;;;;;

(define $to-assoc
  (lambda [$xs]
    (match xs (list something)
      {[<nil> {}]
       [<cons $x (loop $i [2 $n]
                   <cons ,x ...>
                   (& !<cons ,x _> $rs))>
        {[x n] @(to-assoc rs)}]})))

(define $from-assoc
  (lambda [$xs]
    (match xs (list [something integer])
      {[<nil> {}]
       [<cons [$x $n] $rs>
        {@(take n (repeat1 x)) @(from-assoc rs)}]})))

;;;
;;; Assoc List
;;;

(define $assoc-list
  (lambda [$a]
    (matcher
      {[<nil> []
        {[{} {[]}]
         [_ {}]}]
       [<cons $ $> [a (assoc-list a)]
        {[$tgt (match tgt (list [something integer])
                 {[<cons [$x ,1] $rs> {[x rs]}]
                  [<cons [$x $n] $rs> {[x {[x (- n 1)] @rs}]}]
                  [_ {}]})]}]
       [<ncons $ ,$k $> [a (assoc-list a)]
        {[$tgt (match tgt (list [something integer])
                 {[<cons [$x ,k] $rs> {[x rs]}]
                  [<cons [$x (& ?(gt? $ k) $n)] $rs> {[x {[x (- n k)] @rs}]}]
                  [_ {}]})]}]
       [<ncons $ $ $> [a integer (assoc-list a)]
        {[$tgt (match tgt (list [something integer])
                 {[<cons [$x $k] $rs> {[x k rs]}]
                  [_ {}]})]}]
       [,$val []
        {[$tgt (if (eq? val tgt) {[]} {})]}]
       [$ [something]
        {[$tgt {tgt}]}]
       })))

;;;
;;; Assoc Multiset
;;;

(define $assoc-multiset
  (lambda [$a]
    (matcher
      {[<nil> []
        {[{} {[]}]
         [_ {}]}]
       [<cons ,$x $> [(assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [,x $n] $ts>>
                  (if (eq? n 1)
                    {@hs @ts}
                    {@hs [x (- n 1)] @ts})])]}]
       [<cons $ $> [a (assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [$x $n] $ts>>
                  (if (eq? n 1)
                    [x {@hs @ts}]
                    [x {@hs [x (- n 1)] @ts}])])]}]
       [<ncons ,$x ,$n $> [(assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [,x (& ?(gte? $ n) $k)] $ts>>
                  (if (eq? (- k n) 0)
                    {@hs @ts}
                    {@hs [x (- k n)] @ts})])]}]
       [<ncons $ ,$n $> [a (assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [$x (& ?(gte? $ n) $k)] $ts>>
                  (if (eq? (- k n) 0)
                    [x {@hs @ts}]
                    [x {@hs [x (- k n)] @ts}])])]}]
       [<ncons ,$x $ $> [integer (assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [,x $n] $ts>>
                  [n {@hs @ts}]])]}]
       [<ncons $ $ $> [a integer (assoc-multiset a)]
        {[$tgt (match-all tgt (list [a integer])
                 [<join $hs <cons [$x $n] $ts>>
                  [x n {@hs @ts}]])]}]
       [$ [something]
        {[$tgt {tgt}]}]
       })))

(define $AC.intersect
  (lambda [$xs $ys]
    (match-all [xs ys] [(assoc-multiset something) (assoc-multiset something)]
      [[<ncons $x $m _> <ncons ,x $n _>] [x (min {m n})]])))

(define $AC.intersect/m
  (lambda [$a $xs $ys]
    (match-all [xs ys] [(assoc-multiset a) (assoc-multiset a)]
      [[<ncons $x $m _> <ncons ,x $n _>] [x (min {m n})]])))