aboutsummaryrefslogtreecommitdiff
path: root/GraphStore.icl
diff options
context:
space:
mode:
Diffstat (limited to 'GraphStore.icl')
-rw-r--r--GraphStore.icl37
1 files changed, 37 insertions, 0 deletions
diff --git a/GraphStore.icl b/GraphStore.icl
new file mode 100644
index 0000000..e7f0be6
--- /dev/null
+++ b/GraphStore.icl
@@ -0,0 +1,37 @@
+implementation module ABC.GraphStore
+
+import StdEnv
+
+import ABC.Machine
+
+:: GraphStore = { nodes :: [Node]
+ , free :: Int
+ }
+
+STORE_SIZE :== 1000
+
+gs_get :: NodeId GraphStore -> Node
+gs_get i {nodes} = get i nodes
+where
+ get :: NodeId [Node] -> Node
+ get 0 [n:_] = n
+ get _ [] = abortn "gs_get: index too large"
+ get i [_:s] = gs_get (i-1) s
+
+gs_init :: GraphStore
+gs_init = {nodes=[], free=STORE_SIZE}
+
+gs_newnode :: GraphStore -> (GraphStore, NodeId)
+gs_newnode {free=:0} = abortn "gs_newnode: graph store is full"
+gs_newnode {nodes,free} = ({nodes=[Empty:nodes], free=free-1}, free)
+
+gs_update :: NodeId (Node -> Node) GraphStore -> GraphStore
+gs_update i f gs=:{nodes,free}
+| place <= STORE_SIZE-free = {gs & nodes=update place nodes f}
+| otherwise = abortn "gs_update: nodeid nonexistant"
+where
+ place = i - free - 1
+
+ update :: Int [Node] (Node -> Node) -> [Node]
+ update 0 [n:s] f = [f n:s]
+ update i [n:s] f = [n:update (i-1) f s]