class TagDictionary {

    public int intern(TagCollection tags, TagSetEncoder encoder) {
        TagSet ts = new TagSet(tags);
        Integer id = tagSetDic.remove(ts);
        if (id != null) {
            tagSetDic.put(ts, id); // TODO garbage hotspot
            return id;
        }
        else if (tagSetDic.size() < limit) {
            id = tagSetDic.size();
            encodeTag(id, ts, encoder);
            return id;
        }
        else {
            id = evict();
            encodeTag(id, ts, encoder);
            return id;
        }
    }

    public  TagDictionary(int limit);

}