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