diff options
Diffstat (limited to 'hs/list.squig')
-rw-r--r-- | hs/list.squig | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/hs/list.squig b/hs/list.squig new file mode 100644 index 0000000..c5f468c --- /dev/null +++ b/hs/list.squig @@ -0,0 +1,132 @@ +list_new := ??{ + x := { + front := nil; + back := nil; + }; +}; + +list_push_front := ??(list, item){ + list { + if front == nil { + front = { + value := item; + next := nil; + prev := nil; + }; + back = front; + } else { + front = { + value := item; + next := front; + prev := nil; + }; + } + } +}; + +list_push_back := ??(list, item){ + list { + if back == nil { + front = { + value := item; + next := nil; + prev := nil; + }; + back = front; + } else { + back = { + value := item; + next := nil; + prev := back; + }; + } + } +}; + +list_pop_front := ??(list){ + x := nil; + list { + if front == nil { + throw_error("Call to 'list_pop_front' on empty list"); + } + front { + x = value; + front = next; + } + if front == nil { + back = nil; + } + } +}; + +list_pop_back := ??(list){ + x := nil; + list { + if back == nil { + throw_error("Call to 'list_pop_back' on empty list"); + } + back { + x = value; + back = prev; + } + if back == nil { + front = nil; + } + } +}; + +list_get := nil; +{ + get_helper := ??(front, idx){ + if front == nil { + throw_error("Index past end of list in 'list_get'"); + } + y := nil; + if idx == 0 { + front { + y = value; + } + } else { + front { + get_helper(next, idx - 1) {y = x;} + } + } + x := y; + }; + list_get = ??(list, idx){ + if idx < 0 { + throw_error("Negative index in 'list_get'"); + } + y := nil; + list { + get_helper(front, idx) {y = x;} + } + x := y; + }; +}; + +list_set := nil; +{ + set_helper := ??(front, idx, val){ + if front == nil { + throw_error("Index past end of list in 'list_set'"); + } + if idx == 0 { + front { + value = val; + } + } else { + front { + set_helper(next, idx - 1, val); + } + } + }; + list_set = ??(list, idx, val){ + if idx < 0 { + throw_error("Negative index in 'list_set'"); + } + list { + set_helper(front, idx, val); + } + }; +}; |