1 ! Copyright (c) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors byte-vectors destructors io io.backend
4 io.encodings.binary io.files io.streams.byte-array kernel
10 GENERIC: checksum-bytes ( bytes checksum -- value )
11 GENERIC: checksum-stream ( stream checksum -- value )
12 GENERIC: checksum-lines ( lines checksum -- value )
14 M: checksum checksum-bytes
15 [ binary <byte-reader> ] dip checksum-stream ;
17 M: checksum checksum-stream
18 [ stream-contents ] dip checksum-bytes ;
20 M: checksum checksum-lines
21 [ B{ CHAR: \n } join ] dip checksum-bytes ;
23 : checksum-file ( path checksum -- value )
24 [ binary <file-reader> ] dip checksum-stream ;
26 TUPLE: checksum-state < disposable
28 { bytes byte-vector } ;
30 M: checksum-state dispose* drop ;
32 M: checksum-state clone
34 [ clone ] change-bytes ;
36 : new-checksum-state ( class -- checksum-state )
37 new-disposable BV{ } clone >>bytes ;
39 GENERIC: initialize-checksum-state ( checksum -- checksum-state )
40 GENERIC#: add-checksum-bytes 1 ( checksum-state data -- checksum-state )
41 GENERIC: get-checksum ( checksum-state -- value )
43 : with-checksum-state ( ..a checksum quot: ( ..a checksum-state -- ..b ) -- ..b )
44 [ initialize-checksum-state ] dip with-disposal ; inline
46 : add-checksum-stream ( checksum-state stream -- checksum-state )
47 [ [ add-checksum-bytes ] each-block ] with-input-stream ;
49 : add-checksum-lines ( checksum-state lines -- checksum-state )
50 [ B{ CHAR: \n } add-checksum-bytes ]
51 [ add-checksum-bytes ] interleave ;
53 : add-checksum-file ( checksum-state path -- checksum-state )
54 binary <file-reader> add-checksum-stream ;
56 M: checksum initialize-checksum-state
57 checksum-state new-checksum-state swap >>checksum ;
59 M: checksum-state add-checksum-bytes
60 over bytes>> push-all ;
62 M: checksum-state get-checksum
63 [ bytes>> ] [ checksum>> ] bi checksum-bytes ;