blob: e7f0be6cfd961d8c356c9b36bb23b145f0fde4ce (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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]
|