41 lines
1.3 KiB
Racket
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))))]))
|