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/restructure/bitfield.rkt

42 lines
1.3 KiB
Racket

7 years ago
#lang restructure/racket
7 years ago
(require "stream.rkt")
(provide (all-defined-out))
7 years ago
#|
approximates
https://github.com/mbutterick/restructure/blob/master/src/Bitfield.coffee
|#
7 years ago
(define-subclass Streamcoder (Bitfield type [flags empty])
7 years ago
7 years ago
(define/augment (decode stream . args)
(for*/fold ([flag-hash (mhash)])
7 years ago
([val (in-value (send type decode stream))]
[(flag i) (in-indexed flags)])
7 years ago
(hash-set! flag-hash flag (bitwise-bit-set? val i))
flag-hash))
7 years ago
(define/override (size . args) (send type size))
7 years ago
(define/augment (encode stream flag-hash)
7 years ago
(define bitfield-int (for/sum ([(flag i) (in-indexed flags)]
#:when (hash-ref flag-hash flag))
(expt 2 i)))
(send type encode stream bitfield-int)))
7 years ago
(test-module
7 years ago
(require "number.rkt" "stream.rkt")
(define bfer (+Bitfield uint16be '(bold italic underline outline shadow condensed extended)))
(define bf (send bfer decode (+DecodeStream #"\0\25")))
7 years ago
(check-true (hash-ref bf 'bold))
(check-true (hash-ref bf 'underline))
(check-true (hash-ref bf 'shadow))
(check-false (hash-ref bf 'italic))
(check-false (hash-ref bf 'outline))
(check-false (hash-ref bf 'condensed))
(check-false (hash-ref bf 'extended))
7 years ago
(define os (+EncodeStream))
7 years ago
(send bfer encode os bf)
(check-equal? (send os dump) #"\0\25"))