gui/gui-lib/embedded-gui/private/dllist.rkt
2014-12-02 02:33:07 -05:00

53 lines
1.3 KiB
Racket

(module dllist mzscheme
(require
mzlib/class
mzlib/list
mzlib/etc
framework
"interface.rkt")
(provide dllist-mixin dllist% head% tail%)
(define dllist-mixin
(mixin () (dllist<%>)
(field [nextf #f] [prevf #f])
(define/public next
(case-lambda
[(n) (set! nextf n)]
[() nextf]))
(define/public prev
(case-lambda
[(p) (set! prevf p)]
[() prevf]))
(define/public (for-each f . lol)
(apply f this (map first lol))
(send/apply nextf for-each f (map rest lol)))
(define/public (map-to-list f)
(cons (f this) (send nextf map-to-list f)))
(super-new)))
(define dllist% (dllist-mixin object%))
(define head%
(class* dllist% (dllist<%>)
(inherit next)
(define/override prev
(opt-lambda ((p #f))
(error 'prev "Head has no prev")))
(define/override (for-each f . lol)
(send/apply (next) for-each f lol))
(define/override (map-to-list f)
(send (next) map-to-list f))
(super-new)))
(define tail%
(class* dllist% (dllist<%>)
(define/override next
(opt-lambda ((n #f))
(error 'next "Tail has no next")))
(define/override (for-each f . lol) (void))
(define/override (map-to-list f) empty)
(super-new)))
)