File: renamegraph.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (61 lines) | stat: -rw-r--r-- 2,509 bytes parent folder | download | duplicates (5)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
(*
 * This view adds some number k to all node ids of the graph,
 * i.e. rename all node ids.
 *
 * -- Allen
 *)

signature RENAMED_GRAPH_VIEW =
sig

   val rename_view : int -> ('n,'e,'g) Graph.graph -> ('n,'e,'g) Graph.graph

end

structure RenamedGraphView : RENAMED_GRAPH_VIEW =
struct

   structure G = Graph

   fun rename_view k (G.GRAPH G) =
   let fun rename_nodes ns = map (fn (i,n) => (i+k,n)) ns
       fun rename_edges es = map (fn (i,j,e) => (i+k,j+k,e)) es
       fun rename_node_ids ns = map (fn i => i+k) ns
       fun rename_node_ids' ns = (map (fn i => i-k) ns)
   in
       G.GRAPH
       { name            = #name G,
         graph_info      = #graph_info G,
         new_id          = fn n => #new_id G () + k,
         add_node        = fn (i,n) => #add_node G (i-k,n),
         add_edge        = fn (i,j,e) => #add_edge G (i-k,j-k,e),
         remove_node     = fn i => #remove_node G (i-k),
         set_out_edges   = fn (i,es) => #set_out_edges G (i-k,
                               map (fn (i,j,e) => (i-k,j-k,e)) es),
         set_in_edges    = fn (i,es) => #set_in_edges G (i-k,
                               map (fn (i,j,e) => (i-k,j-k,e)) es),
         set_entries     = fn ns => #set_exits G (rename_node_ids ns),
         set_exits       = fn ns => #set_entries G (rename_node_ids ns),
         garbage_collect = #garbage_collect G,
         nodes           = fn () => rename_nodes (#nodes G ()),
         edges           = fn () => rename_edges (#edges G ()),
         order           = #order G,
         size            = #size G,
         capacity        = #capacity G,
         out_edges       = fn i => rename_edges (#out_edges G (i-k)),
         in_edges        = fn i => rename_edges (#in_edges G (i-k)),
         succ            = fn i => rename_node_ids (#succ G (i-k)),
         pred            = fn i => rename_node_ids (#pred G (i-k)),
         has_edge        = fn (i,j) => #has_edge G (i-k,j-k),
         has_node        = fn i => #has_node G (i-k),
         node_info       = fn i => #node_info G (i-k),
         entries         = fn () => rename_node_ids (#entries G ()),
         exits           = fn () => rename_node_ids (#exits G ()),
         entry_edges     = fn i => rename_edges (#entry_edges G (i-k)),
         exit_edges      = fn i => rename_edges (#exit_edges G (i-k)),
         forall_nodes    = fn f => #forall_nodes G (fn (i,n) => f(i+k,n)),
         forall_edges    = fn f => #forall_edges G (fn (i,j,e)=> f(i+k,j+k,e))
       }
   end
end