1 ! Copyright (C) 2009 Daniel Ehrenberg
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: sequences kernel math accessors sequences.private ;
6 TUPLE: bits { number read-only } { length read-only } ;
9 : make-bits ( number -- bits )
11 [ T{ bits f 0 1 } ] [ dup abs log2 1 + <bits> ] if-zero ; inline
13 M: bits length length>> ; inline
15 M: bits nth-unsafe number>> swap bit? ; inline
17 INSTANCE: bits immutable-sequence
19 : bits>number ( seq -- number )
20 <reversed> 0 [ [ 1 shift ] dip [ 1 + ] when ] reduce ;
22 TUPLE: binary-bits < bits ;
24 C: <binary-bits> binary-bits
26 M: binary-bits nth-unsafe call-next-method 1 0 ? ; inline
28 INSTANCE: binary-bits virtual-sequence
30 : make-binary-bits ( number -- binary-bits )
32 [ T{ binary-bits { number 0 } { length 1 } } ]
33 [ dup abs log2 1 + <binary-bits> ] if-zero ; inline