;; ;; 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] (match ys (List a) {[ {[xs {}]}] [ {[xs ys] @(helper {@xs z} zs)}]}))]} (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] (match ys (List a) {[ {[{} xs]}] [ {[ys xs] @(helper {@xs z} zs)}]}))]} (helper {} tgt))]}] [_ [Something] {[$tgt {tgt}]}] }))) (define $map (lambda [$fn $ls] (match ls (List Something) {[ {}] [ {(fn x) @(map fn xs)}]}))) (define $map&concat (lambda [$fn $ls] (match ls (List Something) {[ {}] [ {@(fn x) @(map&concat 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 $occurrence (lambda [$a] (lambda [$xs] (letrec {[$remove&count (lambda [$x $xs] (match xs (List a) {[ [{} 1]] [ (let {[[$r $i] (remove&count x ys)]} [r (+ i 1)])] [ (let {[[$r $i] (remove&count x ys)]} [{y @r} i])]}))]} (match xs (List Something) {[ {}] [ (let {[[$rs $i] (remove&count x ys)]} {[x i] @((occurrence a) rs)})]}))))) (define $subcollections (lambda [$a] (lambda [$xs] (foldr (lambda [$x $rs] (let {[[$y $i] x]} (map&concat (lambda [$sub] (match-all (loop $l $j (between 1 i) {y @l} {}) (List a) [ {@ys @sub}])) rs))) {{}} ((occurrence a) xs))))) (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 [$i $l] (match l (List Something) {[ (if (eq? i 0) x (nth (- i 1) xs))]}))) (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 (letrec {[$helper (lambda [$xs $ys] (match ys (List a) {[ {}] [ (if ((member? a) z xs) (helper {@xs z} zs) {[z {@xs @zs}] @(helper {@xs z} zs)})]}))]} (helper {} tgt))]}] [ [(Multiset a)] {[$tgt (letrec {[$helper (lambda [$xs $ys] (match xs (List Something) {[ ys] [ (if ((member? a) z ys) (helper zs ((remove a) ys z)) {})]}))]} {(helper pxs tgt)})]}] ;; [ [(Multiset a)] ;; {[$tgt (match-all tgt (Multiset a) [ xs])]}] [ [(Multiset a) (Multiset a)] {[$tgt (foldr (lambda [$xi $xs] (let {[[$x $i] xi]} (map&concat (lambda [$sub] (do {[[$ys $zs] sub] [$zs ((remove-all a) zs x)]} (match-all (loop $l $j (between 1 i) {x @l} {}) (List a) [ [{@us @ys} {@zs @vs}]]))) xs))) {[{} tgt]} ((occurrence a) tgt))]}] [_ [Something] {[$tgt {tgt}]}] }))) (define $Set (lambda [$a] (type {[,$val [] {[$tgt (if ((= (Multiset a)) ((unique a) val) ((unique a) tgt)) {[]} {})]}] [ [] {[{} {[]}] [_ {}]}] [ [(Set2 a)] {[$tgt (let {[$tgt2 ((unique a) tgt)]} (if ((member? a) px tgt) {tgt} {}))]}] [ [a (Set2 a)] {[$tgt (let {[$tgt2 ((unique a) tgt)]} (match-all tgt2 (Multiset a) [ [x tgt2]]))]}] [ [(Set2 a) (Set2 a)] {[$tgt (let {[$tgt2 ((unique a) tgt)]} (match-all tgt2 (Multiset a) [ [xs tgt2]]))]}] [_ [Something] {[$tgt {tgt}]}] }))) (define $Set2 ; handle already uniqued target collection (lambda [$a] (type {[,$val [] {[$tgt (if ((= (Multiset a)) ((unique a) val) tgt) {[]} {})]}] [ [] {[{} {[]}] [_ {}]}] [ [(Set a)] {[$tgt (if ((member? a) px tgt) {tgt} {})]}] [ [a (Set a)] {[$tgt (match-all tgt (Multiset a) [ [x tgt]])]}] [ [(Set a) (Set a)] {[$tgt (match-all tgt (Multiset a) [ [xs tgt]])]}] [_ [Something] {[$tgt {tgt}]}] })))