|
|
@ -20,34 +20,58 @@ |
|
|
|
|
|
|
|
(module graph-wrapper racket |
|
|
|
(require (prefix-in g: graph)) |
|
|
|
(provide graph? |
|
|
|
(provide graph? has-vertex? has-edge? |
|
|
|
|
|
|
|
directed-graph |
|
|
|
has-vertex? |
|
|
|
has-edge? |
|
|
|
|
|
|
|
graphviz) |
|
|
|
|
|
|
|
;; Wrap the opaque graph structure coming from the generic |
|
|
|
;; graph library. |
|
|
|
(struct graph (g)) |
|
|
|
|
|
|
|
(define (directed-graph es [ws #f]) |
|
|
|
(graph (g:directed-graph es ws))) |
|
|
|
(define (has-vertex? g v) |
|
|
|
(g:has-vertex? (graph-g g) v)) |
|
|
|
(define (has-edge? g u v) |
|
|
|
(g:has-edge? (graph-g g) u v)) |
|
|
|
|
|
|
|
;; 2 Graph constructors |
|
|
|
;; 2.2 Weighted graphs |
|
|
|
(define (directed-graph es [ws #f]) |
|
|
|
(graph (g:directed-graph es ws))) |
|
|
|
|
|
|
|
;; 10 Graphviz |
|
|
|
(define (graphviz g #:output [output #f] #:colors [colors #f]) |
|
|
|
(g:graphviz (graph-g g) #:output output #:colors colors))) |
|
|
|
|
|
|
|
(require/typed 'graph-wrapper |
|
|
|
|
|
|
|
(require/typed/provide 'graph-wrapper |
|
|
|
[#:opaque Graph graph?] |
|
|
|
[directed-graph (->* ((Listof (List Any Any))) ((Listof Any)) Graph)] |
|
|
|
[has-vertex? (-> Graph Any Boolean)] |
|
|
|
[has-edge? (-> Graph Any Any Boolean)] |
|
|
|
|
|
|
|
;; 2 Graph constructors |
|
|
|
;; 2.2 Weighted graphs |
|
|
|
[directed-graph (->* ((Listof (List Any Any))) ((Listof Any)) Graph)] |
|
|
|
|
|
|
|
;; 10 Graphviz |
|
|
|
[graphviz (->* (Graph) |
|
|
|
(#:output Output-Port |
|
|
|
#:colors (HashTable Any Natural)) |
|
|
|
String)]) |
|
|
|
|
|
|
|
(define g (directed-graph '((a b) (b c)))) |
|
|
|
(has-edge? g 'a 'c) |
|
|
|
(has-vertex? g 'a) |
|
|
|
(graphviz g) |
|
|
|
|
|
|
|
(module+ test |
|
|
|
;; The goal of the tests is to check that all of the provided |
|
|
|
;; functions can be invoked without errors. The tests do not check |
|
|
|
;; whether the results make sense. |
|
|
|
(require typed/rackunit) |
|
|
|
|
|
|
|
(test-case "1 Generic Graph Interface" |
|
|
|
(define g (directed-graph '((a b) (b c)))) |
|
|
|
(check-true (has-edge? g 'a 'c)) |
|
|
|
(check-true (has-vertex? g 'a))) |
|
|
|
|
|
|
|
(test-case "10 Graphviz" |
|
|
|
(define g (directed-graph '((a b) (b c)))) |
|
|
|
(graphviz g))) |