88 lines
1.6 KiB
Factor
88 lines
1.6 KiB
Factor
! Copyright (C) 2011 Alex Vondrak.
|
|
! See http://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
|
|
|
|
<PRIVATE
|
|
|
|
: anon-id ( -- id )
|
|
\ anon-id counter present "_anonymous_" prepend ; inline
|
|
|
|
PRIVATE>
|
|
|
|
: <graph> ( -- graph )
|
|
anon-id f f V{ } clone graph boa ;
|
|
|
|
: <strict-graph> ( -- graph )
|
|
<graph> t >>strict? ;
|
|
|
|
: <digraph> ( -- graph )
|
|
<graph> t >>directed? ;
|
|
|
|
: <strict-digraph> ( -- graph )
|
|
<digraph> t >>strict? ;
|
|
|
|
: <anon> ( -- subgraph )
|
|
anon-id V{ } clone subgraph boa ;
|
|
|
|
: <subgraph> ( id -- subgraph )
|
|
present V{ } clone subgraph boa ;
|
|
|
|
: <cluster> ( id -- subgraph )
|
|
present "cluster_" prepend V{ } clone subgraph boa ;
|
|
|
|
: <node> ( id -- node )
|
|
present <node-attributes> node boa ;
|
|
|
|
DEFER: add-nodes
|
|
|
|
: <edge> ( tail head -- edge )
|
|
[
|
|
dup array?
|
|
[ <anon> swap add-nodes ]
|
|
[ dup subgraph? [ present ] unless ]
|
|
if
|
|
] bi@
|
|
<edge-attributes> edge boa ;
|
|
|
|
! Building graphs
|
|
|
|
: add ( graph statement -- graph' )
|
|
over statements>> push ;
|
|
|
|
: add-node ( graph id -- graph' )
|
|
<node> add ; inline
|
|
|
|
: add-edge ( graph tail head -- graph' )
|
|
<edge> add ; inline
|
|
|
|
: add-nodes ( graph nodes -- graph' )
|
|
[ add-node ] each ;
|
|
|
|
: add-path ( graph nodes -- graph' )
|
|
2 <clumps> [ first2 add-edge ] each ;
|