changeset 84:6d41b71f1b77

Add Map, Filter and Find
author Mike Pavone <pavone@retrodev.com>
date Fri, 30 Jul 2010 23:48:31 +0000
parents 27bb051d631c
children 6d10b5b9ebc3
files functional.rhope
diffstat 1 files changed, 70 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/functional.rhope	Tue Jul 27 23:33:31 2010 -0400
+++ b/functional.rhope	Fri Jul 30 23:48:31 2010 +0000
@@ -21,3 +21,73 @@
 	}
 }
 
+_Map[list,worker,cur:out]
+{
+	val <- [list]Index[cur]
+	nlist <- [list]Set[cur, [worker]Call[val, cur]]
+
+	[nlist]Next[cur]
+	{
+		out <- _Map[nlist, worker, ~]
+	}{
+		out <- Val[nlist]
+	}
+}
+
+Map[list,worker:out]
+{
+	[list]First
+	{
+		out <- _Map[list,worker,~]
+	}{
+		out <- list
+	}
+}
+
+_Find[list,pred,cur:loc,not found]
+{
+	val <- [list]Index[cur]
+	If[[pred]Call[val]]
+	{
+		loc <- cur
+	}{
+		,not found <- [list]Next[cur]
+		{ loc,not found <- _Find[list,pred,~] }
+	}
+}
+
+Find[list,pred:loc,not found]
+{
+	,not found <- [list]First
+	{
+		loc <- _Find[list,pred,~]
+	}
+}
+
+_Filter[list,pred,cur,dest:out]
+{
+	val <- [list]Index[cur]
+	If[[pred]Call[val,cur]]
+	{
+		ndest <- [dest]Append[val]
+	}{
+		ndest <- dest
+	}
+	[list]Next[cur]
+	{
+		out <- _Filter[list,pred,~,ndest]
+	}{
+		out <- Val[ndest]
+	}
+}
+
+Filter[list,pred:out]
+{
+	[list]First
+	{
+		out <- _Filter[list,pred,~, List[]]
+	}{
+		out <- list
+	}
+}
+