1 ! Copyright (c) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors byte-vectors destructors io io.encodings.binary
4 io.files io.streams.byte-array kernel sequences ;
9 GENERIC: checksum-bytes ( bytes checksum -- value )
10 GENERIC: checksum-stream ( stream checksum -- value )
11 GENERIC: checksum-lines ( lines checksum -- value )
13 M: checksum checksum-bytes
14 [ binary <byte-reader> ] dip checksum-stream ;
16 M: checksum checksum-stream
17 [ stream-contents ] dip checksum-bytes ;
19 M: checksum checksum-lines
20 [ B{ CHAR: \n } join ] dip checksum-bytes ;
22 : checksum-file ( path checksum -- value )
23 [ binary <file-reader> ] dip checksum-stream ;
25 TUPLE: checksum-state < disposable
27 { bytes byte-vector } ;
29 M: checksum-state dispose* drop ;
31 M: checksum-state clone
33 [ clone ] change-bytes ;
35 : new-checksum-state ( class -- checksum-state )
36 new-disposable BV{ } clone >>bytes ;
38 GENERIC: initialize-checksum-state ( checksum -- checksum-state )
39 GENERIC#: add-checksum-bytes 1 ( checksum-state data -- checksum-state )
40 GENERIC: get-checksum ( checksum-state -- value )
42 : with-checksum-state ( ..a checksum quot: ( ..a checksum-state -- ..b ) -- ..b )
43 [ initialize-checksum-state ] dip with-disposal ; inline
45 : add-checksum-stream ( checksum-state stream -- checksum-state )
46 [ [ add-checksum-bytes ] each-block ] with-input-stream ;
48 : add-checksum-lines ( checksum-state lines -- checksum-state )
49 [ B{ CHAR: \n } add-checksum-bytes ]
50 [ add-checksum-bytes ] interleave ;
52 : add-checksum-file ( checksum-state path -- checksum-state )
53 binary <file-reader> add-checksum-stream ;
55 M: checksum initialize-checksum-state
56 checksum-state new-checksum-state swap >>checksum ;
58 M: checksum-state add-checksum-bytes
59 over bytes>> push-all ;
61 M: checksum-state get-checksum
62 [ bytes>> ] [ checksum>> ] bi checksum-bytes ;