diff --git a/pitfall/restructure/bitfield.rkt b/pitfall/restructure/bitfield.rkt index 325692cf..d902c582 100644 --- a/pitfall/restructure/bitfield.rkt +++ b/pitfall/restructure/bitfield.rkt @@ -9,34 +9,34 @@ https://github.com/mbutterick/restructure/blob/master/src/Bitfield.coffee (define-subclass Streamcoder (Bitfield type [flags empty]) - (define/augment (decode stream . args) - (for*/fold ([flag-hash (mhash)]) - ([val (in-value (send type decode stream))] - [(flag i) (in-indexed flags)] - #:when flag) - (hash-set! flag-hash flag (bitwise-bit-set? val i)) - flag-hash)) + (define/augment (decode stream . _) + (define flag-hash (mhasheq)) + (for* ([val (in-value (send type decode stream))] + [(flag i) (in-indexed flags)] + #:when flag) + (hash-set! flag-hash (if (symbol? flag) flag (string->symbol "~a" flag)) (bitwise-bit-set? val i))) + flag-hash) - (define/override (size . args) (send type size)) + (define/override (size . _) (send type size)) (define/augment (encode stream flag-hash [ctx #f]) - (define bitfield-int (for/sum ([(flag i) (in-indexed flags)] - #:when (and flag (hash-ref flag-hash flag))) - (expt 2 i))) - (send type encode stream bitfield-int))) + (define bitfield-integer (for/sum ([(flag i) (in-indexed flags)] + #:when (and flag (ref flag-hash flag))) + (arithmetic-shift 1 i))) + (send type encode stream bitfield-integer))) (test-module (require "number.rkt" "stream.rkt") (define bfer (+Bitfield uint16be '(bold italic underline #f shadow condensed extended))) (define bf (send bfer decode (+DecodeStream #"\0\25"))) - (check-equal? (length (hash-keys bf)) 6) ; omits #f flag - (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 'condensed)) - (check-false (hash-ref bf 'extended)) + (check-equal? (length (ref-keys bf)) 6) ; omits #f flag + (check-true (ref bf 'bold)) + (check-true (ref bf 'underline)) + (check-true (ref bf 'shadow)) + (check-false (ref bf 'italic)) + (check-false (ref bf 'condensed)) + (check-false (ref bf 'extended)) (define os (+EncodeStream)) (send bfer encode os bf)