;;; Copyright 2021 Sergiu Ivanov ;;; ;;; Licensed under the Apache License, Version 2.0 (the "License"); ;;; you may not use this file except in compliance with the License. ;;; You may obtain a copy of the License at ;;; ;;; http://www.apache.org/licenses/LICENSE-2.0 ;;; ;;; Unless required by applicable law or agreed to in writing, software ;;; distributed under the License is distributed on an "AS IS" BASIS, ;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ;;; See the License for the specific language governing permissions and ;;; limitations under the License. #lang typed/racket ;;; This file implements Alex Knauth's solution presented here: ;;; ;;; https://stackoverflow.com/questions/65386334/racket-generic-graph-library-in-typed-racket (module graph-wrapper racket (require (prefix-in g: graph)) (provide graph? has-vertex? has-edge? directed-graph graphviz) ;; Wrap the opaque graph structure coming from the generic ;; graph library. (struct graph (g)) (define gg graph-g) (define (has-vertex? g v) (g:has-vertex? (gg g) v)) (define (has-edge? g u v) (g:has-edge? (gg 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 (gg g) #:output output #:colors colors))) (require/typed/provide 'graph-wrapper [#:opaque Graph 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)]) (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)))