1 ! Copyright (C) 2007 Robbert van Dalen.
2 ! See http://factorcode.org/license.txt for BSD license.
4 IN: isequences.ops.cache
5 USING: generic kernel math sequences isequences.base isequences.interface ;
7 ! ** An isequence that caches lazy values of its delegate isequence **
9 GENERIC: CC ( s -- cached-s )
11 TUPLE: icache left right size hash ;
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
17 : cached-length ( s -- n )
18 dup icache-size dup not
19 [ drop dup delegate i-length tuck swap set-icache-size ]
21 : cached-ileft ( s -- s )
22 dup icache-left dup not
23 [ drop dup delegate ileft CC tuck swap set-icache-left ]
25 : cached-iright ( s -- s )
26 dup icache-right dup not
27 [ drop dup delegate iright CC tuck swap set-icache-right ]
29 : cached-$$ ( s -- hash )
30 dup icache-hash dup not
31 [ drop dup delegate $$ tuck swap set-icache-hash ]
34 M: object CC <i-cache> ;
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) ;