diff options
Diffstat (limited to 'list.squig')
-rw-r--r-- | list.squig | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/list.squig b/list.squig new file mode 100644 index 0000000..ea0d333 --- /dev/null +++ b/list.squig @@ -0,0 +1,136 @@ +new_list := ??{ + 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'") + } + x := nil + if idx == 0 { + front { + x = value + } + } else { + front { + found := nil + get_helper(next, idx - 1){ + found = x + } + x = found + } + } + } + list_get = ??(list, idx){ + if idx < 0 { + throw_error("Negative index in 'list_get'") + } + x := nil + list { + found := nil + get_helper(front, idx){ + found = x + } + x = found + } + } +} + +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) + } + } +} |