typed-racket/typed-racket-test/succeed/rec-types.rkt
2014-12-16 10:07:25 -05:00

41 lines
1.3 KiB
Racket

#lang typed-scheme
(define-type-alias number Number)
(define-type-alias boolean Boolean)
(define-type-alias symbol Symbol)
(define-type-alias top Any)
(define-type-alias list-of Listof)
(define-type-alias comparator (top top -> number))
(define-typed-struct (a) heap ([compare : comparator]))
(define-typed-struct (a) (heap-empty heap) ())
(define-typed-struct (a) (heap-node heap)
([rank : number] [elm : a] [left : (Un (heap-node a) (heap-empty a))] [right : (Un (heap-node a) (heap-empty a))]))
(define-type-alias (Heap a) (Un (heap-empty a) (heap-node a)))
(pdefine: (b) (heap-size [h : (Heap b)]) : number
(cond [(heap-empty? h) 0]
[(heap-node? h)
(+ 1 (+ (heap-size (heap-node-left h))
(heap-size (heap-node-right h))))]
;; FIXME - shouldn't need else clause
[else (error "Never happens!")]))
(define-typed-struct npheap ([compare : comparator]))
(define-typed-struct (npheap-empty npheap) ())
(define-typed-struct (npheap-node npheap)
([rank : number] [elm : symbol] [left : (Un npheap-node npheap-empty)] [right : (Un npheap-node npheap-empty)]))
(define-type-alias npHeap (Un npheap-empty npheap-node))
(define: (npheap-size [h : npHeap]) : number
(cond [(npheap-empty? h) 0]
[else
(+ 1 (+ (npheap-size (npheap-node-left h))
(npheap-size (npheap-node-right h))))]))