functor DAGOPT2FLOWOPT( structure F : FlowSig val blockOpt: F.B.Block -> F.B.Block ) : sig structure OF : FlowSig val flowOpt : F.G.Graph -> OF.G.Graph end = struct exception Lookup fun lookup [] _ = raise Lookup | lookup ((k,e) :: t) k' = if k = k' then e else lookup t k' structure OF = struct structure B = F.B structure C = F.C structure G = struct type Vertex = int datatype Graph = FG of( Vertex * ( Vertex list * (B.Block * C.Cond) ) ) list fun vertices (FG g) = map #1 g fun adj (FG g) v = #1(lookup g v) end fun data (G.FG g) v = #2(lookup g v) end fun opt (b,c) = (blockOpt b, c) fun flowOpt g = OF.G.FG(map (fn j => (j, (F.G.adj g j, opt (F.data g j)))) (F.G.vertices g)) end