90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2011 Alex Vondrak.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: accessors fry generic generic.parser generic.standard
 | |
| kernel present quotations sequences slots words
 | |
| graphviz
 | |
| graphviz.attributes
 | |
| ;
 | |
| IN: graphviz.notation
 | |
| 
 | |
| <<
 | |
| 
 | |
| <PRIVATE
 | |
| 
 | |
| ! GENERIC#: =attr 1 ( graphviz-obj val -- graphviz-obj' )
 | |
| ! M: edge/node =attr
 | |
| !   present over attributes>> attr<< ;
 | |
| ! M: sub/graph =attr
 | |
| !   <graph-attributes> swap present >>attr add ;
 | |
| ! M: edge/node/graph-attributes =attr
 | |
| !   present >>attr ;
 | |
| 
 | |
| : =attr-generic ( name -- generic )
 | |
|     "=" prepend "graphviz.notation" 2dup lookup-word
 | |
|     [ 2nip ] [
 | |
|         create-word dup
 | |
|         1 <standard-combination>
 | |
|         ( graphviz-obj val -- graphviz-obj' )
 | |
|         define-generic
 | |
|     ] if* ;
 | |
| 
 | |
| : =attr-method ( class name -- method name )
 | |
|     [ =attr-generic create-method-in ] keep ;
 | |
| 
 | |
| : sub/graph-=attr ( attr -- )
 | |
|     [ graph subgraph ] dip [
 | |
|         =attr-method
 | |
|         setter-word 1quotation
 | |
|         '[ <graph-attributes> swap present @ add ]
 | |
|         define
 | |
|     ] curry bi@ ;
 | |
| 
 | |
| : edge/node-=attr ( class attr -- )
 | |
|     =attr-method
 | |
|     writer-word 1quotation '[ present over attributes>> @ ]
 | |
|     define ;
 | |
| 
 | |
| : graph-obj-=attr ( class attr -- )
 | |
|     over graph =
 | |
|     [ nip sub/graph-=attr ]
 | |
|     [ edge/node-=attr ] if ;
 | |
| 
 | |
| : attrs-obj-=attr ( class attr -- )
 | |
|     =attr-method
 | |
|     setter-word 1quotation '[ present @ ]
 | |
|     define ;
 | |
| 
 | |
| : define-=attrs ( base-class attrs-class -- )
 | |
|     dup "slots" word-prop [
 | |
|         name>>
 | |
|         [ attrs-obj-=attr ] keep
 | |
|         graph-obj-=attr
 | |
|     ] 2with each ;
 | |
| 
 | |
| PRIVATE>
 | |
| 
 | |
| graph graph-attributes define-=attrs
 | |
| edge edge-attributes define-=attrs
 | |
| node node-attributes define-=attrs
 | |
| 
 | |
| >>
 | |
| 
 | |
| ALIAS: -> add-edge
 | |
| ALIAS: -- add-edge
 | |
| ALIAS: ~-> add-path
 | |
| ALIAS: ~-- add-path
 | |
| 
 | |
| ALIAS: [graph <graph-attributes>
 | |
| ALIAS: [node <node-attributes>
 | |
| ALIAS: [edge <edge-attributes>
 | |
| 
 | |
| ALIAS: [add-node <node>
 | |
| ALIAS: [add-edge <edge>
 | |
| ALIAS: [-> <edge>
 | |
| ALIAS: [-- <edge>
 | |
| 
 | |
| ALIAS: ]; add
 | |
| 
 | |
| ! Can't really do add-path[ & add-nodes[ this way, since they
 | |
| ! involve multiple objects.
 |