]> gitweb.factorcode.org Git - factor.git/blob - core/checksums/checksums.factor
Reformat
[factor.git] / core / checksums / checksums.factor
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 ;
5 IN: checksums
6
7 MIXIN: checksum
8
9 GENERIC: checksum-bytes ( bytes checksum -- value )
10 GENERIC: checksum-stream ( stream checksum -- value )
11 GENERIC: checksum-lines ( lines checksum -- value )
12
13 M: checksum checksum-bytes
14     [ binary <byte-reader> ] dip checksum-stream ;
15
16 M: checksum checksum-stream
17     [ stream-contents ] dip checksum-bytes ;
18
19 M: checksum checksum-lines
20     [ B{ CHAR: \n } join ] dip checksum-bytes ;
21
22 : checksum-file ( path checksum -- value )
23     [ binary <file-reader> ] dip checksum-stream ;
24
25 TUPLE: checksum-state < disposable
26     checksum
27     { bytes byte-vector } ;
28
29 M: checksum-state dispose* drop ;
30
31 M: checksum-state clone
32     call-next-method
33     [ clone ] change-bytes ;
34
35 : new-checksum-state ( class -- checksum-state )
36     new-disposable BV{ } clone >>bytes ;
37
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 )
41
42 : with-checksum-state ( ..a checksum quot: ( ..a checksum-state -- ..b ) -- ..b )
43     [ initialize-checksum-state ] dip with-disposal ; inline
44
45 : add-checksum-stream ( checksum-state stream -- checksum-state )
46     [ [ add-checksum-bytes ] each-block ] with-input-stream ;
47
48 : add-checksum-lines ( checksum-state lines -- checksum-state )
49     [ B{ CHAR: \n } add-checksum-bytes ]
50     [ add-checksum-bytes ] interleave ;
51
52 : add-checksum-file ( checksum-state path -- checksum-state )
53     binary <file-reader> add-checksum-stream ;
54
55 M: checksum initialize-checksum-state
56     checksum-state new-checksum-state swap >>checksum ;
57
58 M: checksum-state add-checksum-bytes
59     over bytes>> push-all ;
60
61 M: checksum-state get-checksum
62     [ bytes>> ] [ checksum>> ] bi checksum-bytes ;