// $Id$ $module "refal.plus.List2"; $use Apply Access Arithm Box Compare Table; $func SimplifyFunction t.func e.arg = s.func e.arg; SimplifyFunction t.func e.arg = t.func e.arg $iter { t.func : (t.func1 e.arg1) = t.func1 e.arg1 e.arg; } :: t.func e.arg, t.func : s.funcRef = s.funcRef e.arg; $public $func TryFunc t.func e.res = e.res; TryFunc t.func e.res = { ; e.res; }; $public $func? Apply t.func e.arg = e.res; Apply t.func e.arg = >; $public $func PApply t.func e.arg = t.func; PApply t.func e.arg = :: s.func e.arg, { e.arg : /* empty */ = s.func; = (s.func e.arg); }; $public $func Ints s.start s.end = e.list; Ints s.start s.end = { = s.start $iter e.list s.start :: e.list s.start, s.start : s.end = e.list; = s.start $iter e.list s.start :: e.list s.start, s.start : s.end = e.list; }; $public $func? Head e.list = t.elem; Head t.elem e.tail = t.elem; $public $func? Tail e.list = e.list; Tail t.elem e.tail = e.tail; $public $func? Init e.list = e.list; Init e.init t.last = e.init; $public $func? Last e.list = t.elem; Last e.init t.last = t.last; $public $func SwapR e.list = e.list; SwapR { e.init t.last = t.last e.init; e.list = e.list; }; $public $func SwapL e.list = e.list; SwapL { t.head e.tail = e.tail t.head; e.list = e.list; }; $public $func? Map t.func e.list = e.list; Map t.func e.list = :: s.func e.arg, () e.list $iter { e.list : t.head e.tail = (e.new_list ) e.tail; } :: (e.new_list) e.list, e.list : /*empty*/ = e.new_list; $func? MapInHelp s.func e.arg t.term = t.term; MapInHelp s.func e.arg (e.expr) = (); $public $func? MapIn t.func e.list = e.list; MapIn t.func e.list = ) e.list>; $func? ConcatMapInHelp s.func e.arg t.term = e.list; ConcatMapInHelp s.func e.arg (e.expr) = ; $public $func? ConcatMapIn t.func e.list = e.list; ConcatMapIn t.func e.list = ) e.list>; $public $func MapWithContext t.func e.list = e.list; MapWithContext t.func e.list = :: s.func e.arg, :: s.box, { e.list : e.left t.term e.right, >, $fail; ; }; $func FilterHelp s.func e.arg t.term = e.term_or_empty; FilterHelp s.func e.arg t.term = { :: e = t.term; ; }; $public $func Filter t.func e.list = e.list; Filter t.func e.list = ) e.list>; $func? FilterInHelp s.func e.arg t.term = e.term_or_empty; FilterInHelp s.func e.arg t.term, t.term : (e.expr) = { :: e = t.term; ; }; $public $func FilterIn t.func e.list = e.list; FilterIn t.func e.list = ) e.list>; $func FilterWithContextHelp s.func e.arg (e.left) t.term (e.right) = e.term_or_empty; FilterWithContextHelp s.func e.arg (e.left) t.term (e.right) = { :: e = t.term; ; }; $public $func FilterWithContext t.func e.list = e.list; FilterWithContext t.func e.list = ) e.list>; $public $func Split t.func e.list = (e.true_list) (e.false_list); Split t.func e.list = :: s.func e.arg, () () e.list $iter { e.list : t.head e.tail, { :: e = (e.true_list t.head) (e.false_list) e.tail; = (e.true_list) (e.false_list t.head) e.tail; }; } :: (e.true_list) (e.false_list) e.list, e.list : /*empty*/ = (e.true_list) (e.false_list); $public $func Paren e.expr = t.expr_with_paren; Paren e.expr = (e.expr); $public $func Zip (e.list1) (e.list2) = e.list; Zip (e.list1) (e.list2) = ; $public $func? ZipWith t.func (e.list1) (e.list2) = e.list; ZipWith t.func (e.list1) (e.list2) = :: s.func e.arg, /*empty*/ (e.list1) (e.list2) $iter { e.list1 : t.first1 e.rest1, e.list2 : t.first2 e.rest2 = e.new_list (e.rest1) (e.rest2); } :: e.new_list (e.list1) (e.list2), # \{ e.list1 : v, e.list2 : v; } = e.new_list; $public $func Transpose e.lists = e.lists; Transpose e.lists = ; $func? TransposeWithHelp e.lists = (e.heads) e.tails; TransposeWithHelp e.lists = () () e.lists $iter { e.lists : (e.listsHead) e.listsTail = e.listsHead : t.head e.tail, (e.heads t.head) (e.tails (e.tail)) e.listsTail; } :: (e.heads) (e.tails) e.lists, e.lists : /* empty */ = (e.heads) e.tails; $public $func? TransposeWith t.func e.lists = e.list; TransposeWith t.func e.lists = :: s.func e.arg, (e.lists) $iter { :: (e.heads) e.lists = e.out (e.lists); e.out (); } :: e.out (e.lists), e.lists : /* empty */ = e.out; $public $func Product (e.list1) (e.list2) = e.list; Product (e.list1) (e.list2) = ; $public $func? ProductWith t.func (e.list1) (e.list2) = e.list; ProductWith t.func (e.list1) (e.list2) = :: s.func e.arg, :: s.box, { e.list1 : e t.term1 e, e.list2 : e t.term2 e, >, $fail; ; }; $public $func DirectProduct e.lists = e.lists; DirectProduct e.lists = ; $func? DirectProductWithSHelp (s.func e.arg) e.lists t.term = e.lists; DirectProductWithSHelp (s.func e.arg) e.lists t.term = ; $func? DirectProductWithS (s.func e.arg) e.lists = e.lists; DirectProductWithS (s.func e.arg) e.lists = e.lists : { /* empty */ = ; (e.list) e.tail = ; }; $public $func? DirectProductWith t.func e.lists = e.lists; DirectProductWith t.func e.lists = ) e.lists>; $public $func? IsElem e.list t.item = ; IsElem e t.item e t.item; $public $func? IsNotElem e.list t.item = ; IsNotElem e.list t.item = # ; $public $func Foldl t.func (e.value) e.list = e.value; Foldl t.func (e.value) e.list = :: s.func e.arg, (e.value) e.list $iter { e.list : t.head e.tail = () e.tail; } :: (e.value) e.list, e.list : /*empty*/ = e.value; $public $func Foldl1 t.func v.list = e.value; Foldl1 t.func t.head e.tail = ; $public $func Foldr t.func (e.value) e.list = e.value; Foldr t.func (e.value) e.list = :: s.func e.arg, (e.value) e.list $iter { e.list : e.init t.last = () e.init; } :: (e.value) e.list, e.list : /*empty*/ = e.value; $public $func Foldr1 t.func v.list = e.value; Foldr1 t.func e.init t.last = ; $public $func? All t.func e.list = ; All t.func e.list = :: s.func e.arg, # \{ e.list : e t.item e, # \{ :: e; }; }; $public $func? Any t.func e.list = ; Any t.func e.list = :: s.func e.arg, e.list : e t.item e, :: e; $public $func Subtract (e.list1) (e.list2) = e.list; Subtract (e.list1) (e.list2) = ; $public $func Intersect (e.list1) (e.list2) = e.list; Intersect (e.list1) (e.list2) = ; $public $func Union (e.list1) (e.list2) = e.list; Union (e.list1) (e.list2) = e.list1 ; //$const Concat = (&Map &Deparen_Term); // // ~~~ ; //Paren expr = ; // //Reverse { // term e.list = term; // /*empty*/ = /*empty*/; //}; $public $func Intersperse (e.sep) e.list = e.list; Intersperse { (e.sep) /*empty*/ = /*empty*/; (e.sep) t.head0 = t.head0; (e.sep) t.head0 e.tail0 = (t.head0 e.sep) e.tail0 $iter { e.list : t.head e.tail = (e.new_list t.head e.sep) e.tail; } :: (e.new_list) e.list, e.list : t.last = e.new_list t.last; }; $public $func Separate (e.sep) e.list = e.listOfLists; Separate (e.sep) e.list = () e.list $iter { e.list : e.before e.sep e.after = (e.ll (e.before)) e.after; = (e.ll (e.list)); } :: (e.ll) e.list, e.list : /*empty*/ = e.ll; $func ConcatHelp t.term = e.expr; ConcatHelp { (e.expr) = e.expr; t.term = t.term; }; $public $func Id e.expr = e.expr; Id e.expr = e.expr; $public $func Concat e.lists = e.list; Concat e.lists = ; $public $func? EqTerms t.term t.term = ; EqTerms t1 t1; $public $func Nub e.list = e.list; Nub e.list = ; $public $func NubBy t.eqTerms e.list = e.list; NubBy t.eqTerms e.list = () e.list $iter { e.list : t.head e.tail, { = (e.new_list) e.tail; = (e.new_list t.head) e.tail; }; } :: (e.new_list) e.list, e.list : /*empty*/ = e.new_list; $func FrequenciesHelp (e.expr) (s.num) = s.num e.expr; FrequenciesHelp (e.expr) (s.num) = s.num e.expr; $public $func Frequencies e.list = e.list; Frequencies e.list = :: s.table, { e.list : e t.term e, { ; 0; } : s.num, )>, $fail; >>; }; $public $func SumNumbers e.list = e.list; SumNumbers e.list =
:: s.table, { e.list : e (s.n e.expr) e, { ; 0; } : s.num, )>, $fail; >>; }; //Replicate s.n e.expr = // s.n /*e.list*/ $iter // e.list e.expr // :: s.n e.list, // = // e.list; $public $func CompareTerms t.term t.term = s.cmp; CompareTerms t.term1 t.term2 = ; $func QSort_Split t.cmpTerm e.list = (e.smaller) (e.equal) (e.greater); QSort_Split t.cmpTerm e.list, () () () e.list $iter { e.list : t.head e.tail, : { '<' = (e.smaller) (e.equal) (e.greater t.head) e.tail; '=' = (e.smaller) (e.equal t.head) (e.greater) e.tail; '>' = (e.smaller t.head) (e.equal) (e.greater) e.tail; }; } :: (e.smaller) (e.equal) (e.greater) e.list, e.list : /*empty*/ = (e.smaller) (e.equal) (e.greater); $public $func QSortBy t.cmpTerms e.list = e.list; QSortBy t.cmpTerms e.list = e.list : { /* empty */ = /* empty */; t.head e.tail = :: (e.smaller) (e.equal) (e.greater), t.head e.equal ; }; $public $func QSort e.list = e.list; QSort e.list = ; $public $func QSortAndNubBy t.cmpTerms e.list = e.list; QSortAndNubBy t.cmpTerms e.list = e.list : { /* empty */ = /* empty */; t.head e.tail = :: (e.smaller) t (e.greater), t.head ; }; $public $func QSortAndNub e.list = e.list; QSortAndNub e.list = ; $public $func Sort e.list = e.list; Sort e.list = ; $public $func SortBy t.cmpTerms e.list = e.list; SortBy t.cmpTerms e.list =
2> : { 0 = e.list; s.k = >) (>)>; }; $func Merge t.cmpTerms (e.left) (e.right) = e.merged_list; Merge t.cmpTerms (e.left) (e.right) = (e.left) (e.right) $iter { e.left : t.l e.left_rest, e.right : t.r e.right_rest = { : '<' = e.merged t.l (e.left_rest) (e.right); = e.merged t.r (e.left) (e.right_rest); }; } :: e.merged (e.left) (e.right), \{ e.left : /*empty*/ = e.merged e.right; e.right : /*empty*/ = e.merged e.left; }; $public $func SortAndNub e.list = e.list; SortAndNub e.list = ; $public $func SortAndNubBy t.cmpTerms e.list = e.list; SortAndNubBy t.cmpTerms e.list =
2> : { 0 = e.list; s.k = >) (>)>; }; $func MergeAndNub t.cmpTerms (e.left) (e.right) = e.merged_list; MergeAndNub t.cmpTerms (e.left) (e.right) = (e.left) (e.right) $iter { e.left : t.l e.left_rest, e.right : t.r e.right_rest = : { '<' = e.merged t.l (e.left_rest) (e.right); '>' = e.merged t.r (e.left) (e.right_rest); '=' = e.merged (e.left) (e.right_rest); }; } :: e.merged (e.left) (e.right), \{ e.left : /*empty*/ = e.merged e.right; e.right : /*empty*/ = e.merged e.left; };