summaryrefslogtreecommitdiff
path: root/list.squig
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-02-03 22:00:23 +0100
committertomsmeding <tom.smeding@gmail.com>2017-02-03 22:00:23 +0100
commit7c785439fca59b3801ca2a1118ae25a98d03750d (patch)
tree06ccaadec5dbfda16ec9e08bbb7026cc724e2eda /list.squig
Initial
Diffstat (limited to 'list.squig')
-rw-r--r--list.squig136
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)
+ }
+ }
+}