class TagSet implements Iterable<Tag> {

    TagSet addAll(Iterable<Tag> ts) {
        if (ts instanceof TagSet) {
            TagSet data = (TagSet) ts;
            return addAll(data.tags.values());
        }
        Iterator<Tag> it = ts.iterator();
        TreeMap<String, Tag> newTags = new TreeMap<String, Tag>(tags);
        while (it.hasNext()) {
            BasicTag tag = BasicTag.of(it.next());
            newTags.put(tag.key(), tag);
        }
        return new TagSet(newTags);
    }

    public  TagSet(TreeMap<String, Tag> tags);

}