diff modules/list.tp @ 170:18598163e3ef

Add linked list implementation and cons operator
author Mike Pavone <pavone@retrodev.com>
date Tue, 13 Aug 2013 21:58:03 -0700
parents
children 158444b77c09
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/list.tp	Tue Aug 13 21:58:03 2013 -0700
@@ -0,0 +1,48 @@
+{
+	_empty <- #{
+		length <- { 0 }
+		empty? <- { true }
+		fold:with <- :acc :fun { acc }
+		foldr:with <- :acc :fun { acc }
+		map <- :fun { self }
+		| <- :val {
+			list node: val withTail: self
+		}
+		. <- :right { right }
+	}
+	#{
+		empty <- { _empty }
+		node:withTail <- :_val :_tail {
+			#{
+				value <- { _val }
+				tail <- { _tail }
+				empty? <- { false }
+				length <- {
+					fold: 0 with: :acc val { acc + 1 }
+				}
+				fold:with <- :acc :fun {
+					cur <- self
+					while: { not: (cur empty?)} do: {
+						acc <- fun: acc (cur value)
+						cur <- cur tail
+					}
+					acc
+				}
+				foldr:with <- :acc fun {
+					fun: (_tail foldr: acc with: fun) _val
+				}
+				map <- :fun {
+					node: (fun: _val) withTail: (_tail map: fun)
+				}
+				| <- :val {
+					node: val withTail: self
+				}
+				. <- :right {
+					foldr: right with: :tail val {
+						node: val withTail: tail
+					}
+				}
+			}
+		}
+	}
+}