You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/pitfall/xenomorph/private/base.rkt

110 lines
4.3 KiB
Racket

7 years ago
#lang racket/base
7 years ago
(require racket/class sugar/class racket/generic racket/private/generic-methods "generic.rkt" racket/port)
7 years ago
(require sugar/debug)
7 years ago
(provide (all-defined-out))
7 years ago
(define-generics posable
(pos posable [new-pos])
#:defaults
([port? (define (pos p [new-pos #f]) (when new-pos
7 years ago
(file-position p new-pos))
(file-position p))]))
7 years ago
(define posable<%>
(interface* ()
([(generic-property gen:posable)
(generic-method-table gen:posable
(define (pos o [new-pos #f]) (send o pos new-pos)))])))
7 years ago
7 years ago
(define-generics codable
7 years ago
(decode codable #:parent [parent] [stream])
(encode codable [val] [stream] #:parent [parent]))
7 years ago
7 years ago
(define codable<%>
7 years ago
(interface* ()
7 years ago
([(generic-property gen:codable)
(generic-method-table gen:codable
7 years ago
(define (decode o [port (current-input-port)] #:parent [parent #f])
(send o decode port parent))
(define (encode o [val #f] [port (current-output-port)] #:parent [parent #f])
(when (port? val)
(raise-argument-error 'encode "encodable value" val))
(send o encode port val parent)))])))
7 years ago
(define-generics sizable
(size sizable [val] [parent]))
(define sizable<%>
(interface* ()
([(generic-property gen:sizable)
(generic-method-table gen:sizable
(define (size o [val #f] [parent #f]) (send o size val parent)))])))
(define-generics dumpable
7 years ago
(dump dumpable)
#:defaults
([input-port? (define (dump p) (port->bytes p))]
[output-port? (define (dump p) (get-output-bytes p))]))
7 years ago
(define dumpable<%>
(interface* ()
([(generic-property gen:dumpable)
(generic-method-table gen:dumpable
(define (dump o) (send o dump)))])))
7 years ago
(define (symbol-append . syms)
(string->symbol (apply string-append (map symbol->string syms))))
7 years ago
7 years ago
(define xenomorph-base%
7 years ago
(class* object% (codable<%> sizable<%> dumpable<%>)
7 years ago
(super-new)
(field [_hash (make-hash)]
[_list null])
7 years ago
7 years ago
(define/pubment (decode port [parent #f] . args)
7 years ago
(when parent (unless (indexable? parent)
7 years ago
(raise-argument-error (symbol-append (get-class-name) ':decode) "indexable" parent)))
7 years ago
(define ip (cond
[(bytes? port) (open-input-bytes port)]
[(input-port? port) port]
7 years ago
[else (raise-argument-error (symbol-append (get-class-name) ':decode) "bytes or input port" port)]))
7 years ago
(post-decode (inner (void) decode ip parent) port parent . args))
7 years ago
7 years ago
(define/pubment (encode port val-in [parent #f] . args)
7 years ago
#;(report* port val-in parent)
7 years ago
(define val (pre-encode val-in port))
7 years ago
(when parent (unless (indexable? parent)
7 years ago
(raise-argument-error (symbol-append (get-class-name) ':encode) "indexable" parent)))
7 years ago
(define op (cond
[(output-port? port) port]
[(not port) (open-output-bytes)]
[else (raise-argument-error 'Xenomorph "output port or #f" port)]))
7 years ago
(define encode-result (inner #"" encode op val parent . args))
7 years ago
(when (bytes? encode-result)
(write-bytes encode-result op))
(when (not port) (get-output-bytes op)))
7 years ago
(define/pubment (size [val #f] [parent #f] . args)
7 years ago
(when parent (unless (indexable? parent)
7 years ago
(raise-argument-error (symbol-append (get-class-name) ':size) "indexable" parent)))
7 years ago
(define result (inner (void) size val parent . args))
7 years ago
(cond
[(void? result) 0]
[(and (integer? result) (not (negative? result))) result]
[else (raise-argument-error (symbol-append (get-class-name) ':size) "nonnegative integer" result)]))
(define/public (get-class-name) (define-values (name _) (object-info this))
(or name 'Xenomorph))
7 years ago
7 years ago
(define/public (post-decode val . _) val)
(define/public (pre-encode val . _) val)
7 years ago
(define/public (dump) (void))))
7 years ago
(define-class-predicates xenomorph-base%)
(define-subclass xenomorph-base% (RestructureBase))
(define-subclass RestructureBase (Streamcoder))