from __future__ import absolute_import, division, unicode_literals

from itertools import chain

from datrie import Trie as DATrie
from six import text_type

from ._base import Trie as ABCTrie

class Trie(ABCTrie):
    def __init__(self, data):
        chars = set()
        for key in data.keys():
            if not isinstance(key, text_type):
                raise TypeError("All keys must be strings")
            for char in key:
                chars.add(char)

        self._data = DATrie("".join(chars))
        for key, value in data.items():
            self._data[key] = value

    def __contains__(self, key):
        return key in self._data

    def __len__(self):
        return len(self._data)

    def __iter__(self):
        raise NotImplementedError()

    def __getitem__(self, key):
        return self._data[key]

    def keys(self, prefix=None):
        return self._data.keys(prefix)

    def has_keys_with_prefix(self, prefix):
        return self._data.has_keys_with_prefix(prefix)

    def longest_prefix(self, prefix):
        return self._data.longest_prefix(prefix)

    def longest_prefix_item(self, prefix):
        return self._data.longest_prefix_item(prefix)

from __future__ import absolute_import, division, unicode_literals

from itertools import chain

from datrie import Trie as DATrie

from ._base import Trie as ABCTrie

class Trie(ABCTrie):
    def __init__(self, data):
        chars = set()
        for key in data.keys():
            if not isinstance(key, str):
                raise TypeError("All keys must be strings")
            for char in key:
                chars.add(char)

        self._data = DATrie("".join(chars))
        for key, value in data.items():
            self._data[key] = value

    def __contains__(self, key):
        return key in self._data

    def __len__(self):
        return len(self._data)

    def __iter__(self):
        raise NotImplementedError()

    def __getitem__(self, key):
        return self._data[key]

    def keys(self, prefix=None):
        return self._data.keys(prefix)

    def has_keys_with_prefix(self, prefix):
        return self._data.has_keys_with_prefix(prefix)

    def longest_prefix(self, prefix):
        return self._data.longest_prefix(prefix)

    def longest_prefix_item(self, prefix):
        return self._data.longest_prefix_item(prefix)

--- 
+++ 
@@ -3,6 +3,7 @@
 from itertools import chain
 
 from datrie import Trie as DATrie
+from six import text_type
 
 from ._base import Trie as ABCTrie
 
@@ -10,7 +11,7 @@
     def __init__(self, data):
         chars = set()
         for key in data.keys():
-            if not isinstance(key, str):
+            if not isinstance(key, text_type):
                 raise TypeError("All keys must be strings")
             for char in key:
                 chars.add(char)
Fix DATrie support under Python 2.

This is a simple issue of using `str` to refer to what should be
`six.text_type`.
