PasteRack.org
Paste # 44174
2020-11-08 11:38:15

Fork as a new paste.

Paste viewed 341 times.


Embed:

typed racket classes and mixins

#lang typed/racket/base

(require typed/racket/class)


(define-type recipe<%>
  (Class (init [name String])
         (get-name (-> String))))
(: recipe% recipe<%>)
(define recipe%
  (class object%
    (init [name : String])
    (super-new)
    (: _name String)
    (define _name name)
    (define/public (get-name) _name)))


(: amount-mixin (->  recipe<%>
                     (Class #:implements recipe<%>
                            (init [amount Number]
                                  [name String])
                            (get-amount (-> Number)))))
(define (amount-mixin %)
  (class %
    (init [amount : Number])
    (: _amount Number)
    (define _amount amount)
    (super-new)
    (inherit get-name)
    (define/public (get-amount) _amount)))


(: unit-mixin (-> recipe<%> (Class #:implements recipe<%>
                                   (init [unit String]
                                         [name String])
                                   (get-unit (-> String)))))
(define (unit-mixin %)
  (class %
    (init [unit : String])
    (: _unit String)
    (define _unit unit)
    (super-new)
    (inherit get-name)
    (define/public (get-unit) _unit)))


(unit-mixin (amount-mixin recipe%))