! Copyright (C) 2011 Alex Vondrak. ! See https://factorcode.org/license.txt for BSD license. USING: accessors arrays grouping kernel namespaces present sequences strings graphviz.attributes ; IN: graphviz TUPLE: graph { id string } { strict? boolean } { directed? boolean } statements ; TUPLE: subgraph { id string } statements ; TUPLE: node { id string } { attributes node-attributes } ; TUPLE: edge tail head { attributes edge-attributes } ; ! Constructors : ( -- graph ) anon-id f f V{ } clone graph boa ; : ( -- graph ) t >>strict? ; : ( -- graph ) t >>directed? ; : ( -- graph ) t >>strict? ; : ( -- subgraph ) anon-id V{ } clone subgraph boa ; : ( id -- subgraph ) present V{ } clone subgraph boa ; : ( id -- subgraph ) present "cluster_" prepend V{ } clone subgraph boa ; : ( id -- node ) present node boa ; DEFER: add-nodes : ( tail head -- edge ) [ dup array? [ swap add-nodes ] [ dup subgraph? [ present ] unless ] if ] bi@ edge boa ; ! Building graphs : add ( graph statement -- graph' ) over statements>> push ; : add-node ( graph id -- graph' ) add ; inline : add-edge ( graph tail head -- graph' ) add ; inline : add-nodes ( graph nodes -- graph' ) [ add-node ] each ; : add-path ( graph nodes -- graph' ) 2 [ first2 add-edge ] each ;