]> gitweb.factorcode.org Git - factor.git/blob - core/checksums/checksums.factor
factor: Rename GENERIC# to GENERIC#:.
[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 checksum { bytes byte-vector } ;
27
28 M: checksum-state dispose drop ;
29
30 M: checksum-state clone
31     call-next-method
32     [ clone ] change-bytes ;
33
34 : new-checksum-state ( class -- checksum-state )
35     new BV{ } clone >>bytes ;
36
37 GENERIC: initialize-checksum-state ( checksum -- checksum-state )
38 GENERIC#: add-checksum-bytes 1 ( checksum-state data -- checksum-state )
39 GENERIC: get-checksum ( checksum-state -- value )
40
41 : with-checksum-state ( ..a checksum quot: ( ..a checksum-state -- ..b ) -- ..b )
42     [ initialize-checksum-state ] dip with-disposal ; inline
43
44 : add-checksum-stream ( checksum-state stream -- checksum-state )
45     [ [ add-checksum-bytes ] each-block ] with-input-stream ;
46
47 : add-checksum-lines ( checksum-state lines -- checksum-state )
48     [ B{ CHAR: \n } add-checksum-bytes ]
49     [ add-checksum-bytes ] interleave ;
50
51 : add-checksum-file ( checksum-state path -- checksum-state )
52     binary <file-reader> add-checksum-stream ;
53
54 M: checksum initialize-checksum-state
55     checksum-state new-checksum-state swap >>checksum ;
56
57 M: checksum-state add-checksum-bytes
58     over bytes>> push-all ;
59
60 M: checksum-state get-checksum
61     [ bytes>> ] [ checksum>> ] bi checksum-bytes ;