(module edges mzscheme
(require (lib "plt-match.ss"))
(provide make put! get labels states)
(define-struct DenseEdges (table))
(define-struct SparseEdges (table))
(define *density-threshold* 3)
(define (make depth)
(if (< depth *density-threshold*)
(make-DenseEdges (make-hash-table 'equal))
(make-SparseEdges (list))))
(define (put! edges label state)
(match edges
[(struct DenseEdges (table))
(hash-table-put! table label state)
(void)]
[(struct SparseEdges (table))
(set-SparseEdges-table! edges
(cons (cons label state) table))
(void)]
[else (raise-type-error 'set-edge "Edges" edges)]))
(define get
(let ((*empty-thunk* (lambda () #f)))
(lambda (edges label)
(match edges
[(struct DenseEdges (table))
(hash-table-get table label *empty-thunk*)]
[(struct SparseEdges (table))
(let ((lookup (assv label table)))
(if lookup
(cdr lookup)
#f))]
[else (raise-type-error 'set-edge "Edges" edges)]))))
(define (labels edges)
(match edges
[(struct DenseEdges (table))
(hash-table-map table (lambda (k v) k))]
[(struct SparseEdges (table))
(map car table)]
[else (raise-type-error 'set-edge "Edges" edges)]))
(define (states edges)
(match edges
[(struct DenseEdges (table))
(hash-table-map table (lambda (k v) v))]
[(struct SparseEdges (table))
(map cdr table)]
[else (raise-type-error 'set-edge "Edges" edges)]))
)