view 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 source

{
	_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
					}
				}
			}
		}
	}
}