#!/usr/bin/python3 -i
#
# Copyright (c) 2019 Collabora, Ltd.
#
# SPDX-License-Identifier: Apache-2.0
#
# Author(s):    Ryan Pavlik <ryan.pavlik@collabora.com>
"""Provides general-purpose data structures."""


class DictOfStringSets:
    """A dictionary where the values are sets of strings.

    Has some convenience functions to allow easier maintenance via
    the .add method."""

    def __init__(self, d=None):
        self.d = {}
        if d:
            for k, v in d.items():
                self.add(k, v)

    def __getitem__(self, k):
        return self.d[k]

    def __contains__(self, k):
        return k in self.d

    def get(self, k, default=None):
        return self.d.get(k, default)

    def get_dict(self):
        return self.d

    def items(self):
        """Return an iterator like dict().items()."""
        return self.d.items()

    def keys(self):
        """Return an iterator over keys."""
        return self.d.keys()

    def values(self):
        """Return an iterator over values."""
        return self.d.values()

    def add_key(self, k):
        """Ensure the set for the given key exists."""
        if k not in self.d:
            self.d[k] = set()

    def add(self, k, v):
        self.add_key(k)
        if isinstance(v, str):
            v = (v, )
        if not isinstance(v, set):
            v = set(v)
        self.d[k].update(v)
