1 ! Copyright (C) 2011 Alex Vondrak.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays grouping kernel namespaces present
21 { attributes node-attributes } ;
26 { attributes edge-attributes } ;
33 \ anon-id counter present "_anonymous_" prepend ; inline
37 : <graph> ( -- graph )
38 anon-id f f V{ } clone graph boa ;
40 : <strict-graph> ( -- graph )
43 : <digraph> ( -- graph )
44 <graph> t >>directed? ;
46 : <strict-digraph> ( -- graph )
47 <digraph> t >>strict? ;
49 : <anon> ( -- subgraph )
50 anon-id V{ } clone subgraph boa ;
52 : <subgraph> ( id -- subgraph )
53 present V{ } clone subgraph boa ;
55 : <cluster> ( id -- subgraph )
56 present "cluster_" prepend V{ } clone subgraph boa ;
58 : <node> ( id -- node )
59 present <node-attributes> node boa ;
63 : <edge> ( tail head -- edge )
66 [ <anon> swap add-nodes ]
67 [ dup subgraph? [ present ] unless ]
70 <edge-attributes> edge boa ;
74 : add ( graph statement -- graph' )
75 over statements>> push ;
77 : add-node ( graph id -- graph' )
80 : add-edge ( graph tail head -- graph' )
83 : add-nodes ( graph nodes -- graph' )
86 : add-path ( graph nodes -- graph' )
87 2 <clumps> [ first2 add-edge ] each ;