UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture14/ duck.rkt
#lang typed/racket
(require typed/racket/class)
(require [rename-in typed/rackunit [check-equal? test]])
(define node%
  (class object%
    (init [with-size : Real])
    (define current-size : Real with-size)
    (define/public (size) current-size)
    (super-new)))

(define empty%
  (class object%
    (define/public (size) 0)
    (super-new)))
(ann empty% (Class (size (-> Real)))) ;; more general

(define mt%
  (class object%
    (define/public (size) 0)
    (super-new)))

(define (m [arg : (Object (size (-> Real)))]) : Real
  (send arg size))

(test (m (new empty%)) 0)
(test (m (new mt%)) 0)
(test (m (new node% [with-size 2])) 2)