2 USING: kernel sequences assocs sets locals combinators
3 accessors system math math.functions unicode.case prettyprint
4 combinators.smart dns ;
8 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10 TUPLE: <entry> time data ;
12 : now ( -- seconds ) millis 1000.0 / round >integer ;
14 : expired? ( <entry> -- ? ) time>> now <= ;
16 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
18 : make-cache-key ( obj -- key )
19 [ [ name>> >lower ] [ type>> ] [ class>> ] tri ] output>array ;
21 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23 : cache ( -- table ) H{ } ;
25 : cache-at ( obj -- ent ) make-cache-key cache at ;
26 : cache-delete ( obj -- ) make-cache-key cache delete-at ;
27 : cache-set-at ( ent obj -- ) make-cache-key cache set-at ;
29 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
31 :: cache-get ( OBJ -- rrs/f )
32 [let | ENT [ OBJ cache-at ] |
35 { [ ENT expired? ] [ OBJ cache-delete f ] }
39 [let | NAME [ OBJ name>> ]
42 TTL [ ENT time>> now - ] |
44 [| RDATA | T{ rr f NAME TYPE CLASS TTL RDATA } ]
53 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
55 :: cache-add ( RR -- )
56 [let | ENT [ RR cache-at ]
57 TIME [ RR ttl>> now + ]
58 RDATA [ RR rdata>> ] |
60 { [ ENT f = ] [ T{ <entry> f TIME V{ RDATA } } RR cache-set-at ] }
61 { [ ENT expired? ] [ RR cache-delete RR cache-add ] }
62 { [ t ] [ TIME ENT (>>time) RDATA ENT data>> adjoin ] }