1 (define-module (scm graphviz)
3 #:export (make-graph add-node add-edge))
5 (define (make-graph filename)
6 (let ((empty-graph (list->vector (list filename '() '() '()))))
7 (ly:atexit write-graph (list empty-graph))
10 (define (filename g) (vector-ref g 0))
11 (define (nodes g) (vector-ref g 1))
12 (define (edges g) (vector-ref g 2))
13 (define (clusters g) (vector-ref g 3))
15 (define (add-node graph label)
16 (let ((ns (nodes graph)))
17 (vector-set! graph 1 (cons `(,(length ns) . ,label) ns))
20 (define (add-edge graph node1 node2)
21 (vector-set! graph 2 (cons `(,node1 . ,node2) (edges graph))))
23 (define (write-graph graph)
24 (let ((out (open-file (filename graph) "w"))
27 (cc (clusters graph)))
28 (ly:message (format "writing graph ~s..." (filename graph)))
29 (display "digraph G {\nrankdir=\"LR\"\nnode [shape=rectangle]\n" out)
30 (map (lambda (n) (display (format "~a [label=\"~a\"]\n" (car n) (cdr n)) out))
32 (map (lambda (e) (display (format "~a -> ~a\n" (car e) (cdr e)) out))