diff options
Diffstat (limited to 'frontend')
-rw-r--r-- | frontend/utilities.dcl | 5 | ||||
-rw-r--r-- | frontend/utilities.icl | 30 |
2 files changed, 35 insertions, 0 deletions
diff --git a/frontend/utilities.dcl b/frontend/utilities.dcl index 909f859..664375b 100644 --- a/frontend/utilities.dcl +++ b/frontend/utilities.dcl @@ -115,3 +115,8 @@ iterateSt op st :== iterate_st op st revAppend :: ![a] ![a] -> [a] // Reverse the list using the second argument as accumulator. revMap :: !(.a -> .b) ![.a] !u:[.b] -> u:[.b] +:: Bag x = Empty | Single !x | Pair !(Bag x) !(Bag x) + +uniqueBagToList :: !*(Bag x) -> [x] // exploits reuse of unique nodes (if compiled with that option) +bagToList :: !(Bag x) -> [x] +isEmptyBag :: !(Bag x) -> Bool diff --git a/frontend/utilities.icl b/frontend/utilities.icl index c721d71..b7cb0d5 100644 --- a/frontend/utilities.icl +++ b/frontend/utilities.icl @@ -222,3 +222,33 @@ zip2Append [] [] tail zip2Append [x : xs] [y : ys] tail = [(x,y) : zip2Append xs ys tail] */ + +:: Bag x = Empty | Single !x | Pair !(Bag x) !(Bag x) + +uniqueBagToList :: !*(Bag x) -> [x] // exploits reuse of unique nodes (if compiled with that option) +uniqueBagToList bag + = accumulate_elements bag [] + where + accumulate_elements :: !*(Bag x) [x] -> [x] + accumulate_elements Empty accu + = accu + accumulate_elements (Single element) accu + = [element : accu] + accumulate_elements (Pair bag1 bag2) accu + = accumulate_elements bag1 (accumulate_elements bag2 accu) + +bagToList :: !(Bag x) -> [x] +bagToList bag + = accumulate_elements bag [] + where + accumulate_elements :: !(Bag x) [x] -> [x] + accumulate_elements Empty accu + = accu + accumulate_elements (Single element) accu + = [element : accu] + accumulate_elements (Pair bag1 bag2) accu + = accumulate_elements bag1 (accumulate_elements bag2 accu) + +isEmptyBag :: !(Bag x) -> Bool +isEmptyBag Empty = True +isEmptyBag _ = False |