From 7c785439fca59b3801ca2a1118ae25a98d03750d Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 3 Feb 2017 22:00:23 +0100 Subject: Initial --- list.squig | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 list.squig (limited to 'list.squig') 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) + } + } +} -- cgit v1.2.3-54-g00ecf