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