TUPLE: limited-assoc limit assoc queue ; : ( limit exemplar -- limited-assoc ) clone limited-assoc boa ; : ( limit -- limited-assoc ) H{ } ; M: limited-assoc at* assoc>> at* ; M: limited-assoc assoc-size assoc>> assoc-size ; M: limited-assoc >alist assoc>> >alist ; : unqueue-key ( key limited-assoc -- ) queue>> [ = ] with delete-node-if drop ; inline : possibly-delete-key ( limited-assoc -- ) dup [ assoc>> assoc-size ] [ limit>> ] bi >= [ [ queue>> pop-front ] [ assoc>> delete-at ] bi ] [ drop ] if ; : queue-key ( key limited-assoc -- ) queue>> push-back ; inline M: limited-assoc set-at 2dup assoc>> key? [ 2dup unqueue-key ] [ dup possibly-delete-key ] if [ queue>> push-back ] [ assoc>> set-at ] 2bi ; M: limited-assoc delete-at [ unqueue-key ] [ assoc>> delete-at ] 2bi ; M: limited-assoc clear-assoc [ assoc>> clear-assoc ] [ queue>> clear-deque ] bi ; INSTANCE: limited-assoc assoc