1 USING: arrays assocs byte-arrays combinators io
2 io.encodings.binary io.streams.byte-array io.streams.string
3 kernel linked-assocs math math.parser sequences sequences.extras strings ;
6 GENERIC: >bencode ( obj -- bencode )
9 number>string "i" "e" surround ;
12 [ length number>string ":" ] keep 3append ;
14 M: byte-array >bencode "" like >bencode ;
17 [ >bencode ] map concat "l" "e" surround ;
20 [ [ >bencode ] bi@ append ] { } assoc>map concat
27 : read-integer ( -- obj )
28 "e" read-until CHAR: e assert= string>number ;
30 : read-list ( -- obj )
31 [ read-bencode ] loop>array ;
33 : read-dictionary ( -- obj )
35 read-bencode [ read-bencode 2array ] [ f ] if*
36 ] loop>array >linked-hash ;
38 : read-string ( prefix -- obj )
39 ":" read-until CHAR: : assert= swap prefix
40 string>number read "" like ;
44 : read-bencode ( -- obj )
46 { CHAR: i [ read-integer ] }
47 { CHAR: l [ read-list ] }
48 { CHAR: d [ read-dictionary ] }
53 GENERIC: bencode> ( bencode -- obj )
55 M: byte-array bencode>
56 binary [ read-bencode ] with-byte-reader ;
59 [ read-bencode ] with-string-reader ;