: query->rr ( query -- rr ) [ name>> ] [ type>> ] [ class>> ] tri f f rr boa ; : query+entry->rrs ( query entry -- rrs ) swap ! entry query query->rr ! entry rr over ! entry rr entry time>> time->ttl >>ttl ! entry rr swap ! rr entry data>> [ >r dup clone r> >>rdata ] map nip ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : expired? ( entry -- ? ) time>> time->ttl 0 <= ; : cache-get* ( query -- rrs/NX/f ) dup table-get ! query result { { [ dup f = ] [ 2drop f ] } ! not in the cache { [ dup expired? ] [ drop table-rem f ] } ! here but expired { [ dup nx? ] [ 2drop NX ] } ! negative result cached { [ t ] [ query+entry->rrs ] } ! good to go } cond ;