;; ;; Collection.egi ;; (define $List (lambda [$a] (type {[,$val [] {[$tgt (match [val tgt] [(List a) (List a)] {[[ ] {[]}] [[ ] {[]}] [[_ _] {}]})]}] [ [] {[{} {[]}] [_ {}]}] [ [a (List a)] {[{$x .$xs} {[x xs]}] [_ {}]}] [ [a (List a)] {[{.$xs $x} {[x xs]}] [_ {}]}] [ [(List a)] {[$tgt (letrec {[$helper (lambda [$pxs $tgt] (match [pxs tgt] [(List a) (List a)] {[[ _] {tgt}] [[ ] (helper xs ys)] [[_ _] {}]}))]} (helper pxs tgt))]}] [ [(List a)] {[$tgt (letrec {[$helper (lambda [$pys $tgt] (match [pys tgt] [(List a) (List a)] {[[ _] {tgt}] [[ ] (helper xs ys)] [[_ _] {}]}))]} (helper pys tgt))]}] [ [(List a) (List a)] {[$tgt (letrec {[$helper (lambda [$xs $ys $r] (match ys (List a) {[ {[xs {}] @r}] [ (helper {@xs z} zs {[xs ys] @r})]}))]} (helper {} tgt {}))]}] [ [(List a)] {[$tgt (match-all tgt (List a) [ ys])]}] [ [(List a)] {[$tgt (match-all tgt (List a) [ xs])]}] [ [(List a) (List a)] {[$tgt (letrec {[$helper (lambda [$xs $ys $r] (match ys (List a) {[ {[{} xs] @r}] [ (helper {@xs z} zs {[ys xs] @r})]}))]} (helper {} tgt {}))]}] [_ [Something] {[$tgt {tgt}]}] }))) (define $map (lambda [$fn $ls] (match ls (List Something) {[ {}] [ {(fn x) @(map fn xs)}]}))) (define $foldr (lambda [$fn $init $ls] (match ls (List Something) {[ init] [ (fn x (foldr fn init xs))]}))) (define $foldl (lambda [$fn $init $ls] (match ls (List Something) {[ init] [ (let {[$y (fn init x)]} (foldl fn y xs))]}))) (define $filter (lambda [$pred $ls] (match ls (List Something) {[ {}] [ (if (pred x) {x @(filter pred xs)} (filter pred xs))]}))) (define $remove (lambda [$a] (lambda [$xs $x] (match xs (List a) {[ {}] [ rs] [ {y @((remove a) rs x)}]})))) (define $remove-all (lambda [$a] (lambda [$xs $x] (match xs (List a) {[ {}] [ ((remove-all a) rs x)] [ {y @((remove-all a) rs x)}]})))) (define $remove-collection (lambda [$a] (lambda [$xs $ys] (match ys (List a) {[ xs] [ ((remove-collection a) ((remove a) xs y) rs)]})))) (define $add (lambda [$a] (lambda [$xs $x] (if ((member? Integer) x xs) xs {@xs x})))) (define $union (lambda [$a] (lambda [$xs $ys] (match ys (List a) {[ xs] [ ((union a) ((add a) xs y) rs)]})))) (define $subcollections (lambda [$xs] (match xs (List Something) {[ {{}}] [ (let {[$subs (subcollections rs)]} {@subs @(map (lambda [$sub] {x @sub}) subs)})]}))) (define $size (lambda [$xs] (match xs (List Something) {[ 0] [ (+ 1 (size rs))]}))) (define $car (lambda [$xs] (match xs (List Something) {[ x]}))) (define $cdr (lambda [$xs] (match xs (List Something) {[ ys]}))) (define $rac (lambda [$xs] (match xs (List Something) {[ x]}))) (define $rdc (lambda [$xs] (match xs (List Something) {[ ys]}))) (define $nth (lambda [$n $ls] (if (eq-n? n 1) (car ls) (nth (- n 1) (cdr ls))))) (define $reverse (lambda [$xs] (match xs (List Something) {[ {}] [ {@(reverse rs) x}]}))) (define $member? (lambda [$a] (lambda [$x $ys] (match ys (List a) {[ #f] [ #t] [ ((member? a) x ys)]})))) (define $unique (lambda [$a] (lambda [$xs] (letrec {[$loop-fn (lambda [$xs $ys] (match xs (List a) {[ ys] [ (if ((member? a) x ys) (loop-fn rs ys) (loop-fn rs {@ys x}))]}))]} (loop-fn xs {}))))) (define $subcollection? (lambda [$a] (lambda [$xs $ys] (match xs (List a) {[ #t] [ (if ((member? a) x ys) ((subcollection? a) rest ys) #f)]})))) (define $concat (lambda [$xs] (match xs (List Something) {[ {}] [ {@x @(concat rs)}]}))) (define $Multiset (lambda [$a] (type {[,$val [] {[$tgt (match [val tgt] [(List a) (Multiset a)] {[[ ] {[]}] [[ ] {[]}] [[_ _] {}]})]}] [ [] {[{} {[]}] [_ {}]}] [ [(Multiset a)] {[$tgt (if ((member? a) px tgt) {((remove a) tgt px)} {})]}] [ [a (Multiset a)] {[$tgt (map (lambda [$t] [t ((remove a) tgt t)]) ((unique a) tgt))]}] [ [(Multiset a)] {[$tgt (if ((subcollection? a) pxs tgt) {((remove-collection a) tgt pxs)} {})]}] [ [(Multiset a) (Multiset a)] {[$tgt (map (lambda [$ts] [ts ((remove-collection a) tgt ts)]) (subcollections tgt))]}] [_ [Something] {[$tgt {tgt}]}] }))) (define $Set (lambda [$a] (type {[,$val [] {[$tgt (if (and ((subcollection? a) val tgt) ((subcollection? a) tgt val)) {[]} {})]}] [ [] {[{} {[]}] [_ {}]}] [ [a (Set a)] {[$tgt (let {[$tgt2 ((unique a) tgt)]} {@(match-all tgt2 (Multiset a) [ [x xs]]) @(match-all tgt2 (Multiset a) [ [x {@xs x}]])})]}] [ [(Set a) (Set a)] {[$tgt (let {[$tgt2 ((unique a) tgt)]} (concat (map (lambda [$xs $ys] (map (lambda [$sxs] [xs {@ys @sxs}]) (subcollections xs))) (match-all tgt2 (Multiset a) [ [xs ys]]))))]}] [_ [Something] {[$tgt {tgt}]}] })))