summaryrefslogtreecommitdiff
path: root/hs/list.squig
diff options
context:
space:
mode:
Diffstat (limited to 'hs/list.squig')
-rw-r--r--hs/list.squig132
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);
+ }
+ };
+};