]> gitweb.factorcode.org Git - factor.git/blob - unmaintained/isequences/ops/cache/cache.factor
52861705901d11ac4be02cee9bc2efeb5506e0f9
[factor.git] / unmaintained / isequences / ops / cache / cache.factor
1 ! Copyright (C) 2007 Robbert van Dalen.
2 ! See http://factorcode.org/license.txt for BSD license.
3
4 IN: isequences.ops.cache
5 USING: generic kernel math sequences isequences.base isequences.interface ;
6
7 ! ** An isequence that caches lazy values of its delegate isequence **
8
9 GENERIC: CC ( s -- cached-s )
10
11 TUPLE: icache left right size hash ;
12
13 : <i-cache> ( s -- cs )
14     ! only cache isequences with size > 16
15     dup i-length 16 > [ f f f f <icache> tuck set-delegate ] when ; inline
16     
17 : cached-length ( s -- n )
18     dup icache-size dup not
19     [ drop dup delegate i-length tuck swap set-icache-size ]
20     [ nip ] if ; inline
21 : cached-ileft ( s -- s ) 
22     dup icache-left dup not
23     [ drop dup delegate ileft CC tuck swap set-icache-left ]
24     [ nip ] if ; inline
25 : cached-iright ( s -- s )
26     dup icache-right dup not
27     [ drop dup delegate iright CC tuck swap set-icache-right ]
28     [ nip ] if ; inline
29 : cached-$$ ( s -- hash ) 
30     dup icache-hash dup not
31     [ drop dup delegate $$ tuck swap set-icache-hash ]
32     [ nip ] if ; inline
33
34 M: object CC <i-cache> ;
35 M: integer CC ;
36 M: icache CC ;
37
38 M: icache i-at (i-at) ;
39 M: icache i-length cached-length ;
40 M: icache ileft cached-ileft ;
41 M: icache iright cached-iright ;
42 M: icache ihead (ihead) ;
43 M: icache itail (itail) ;
44 M: icache $$ ($$) ;
45