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)

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)

Fix DATrie support under Python 2.
Fix DATrie support under Python 2.

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

  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, str):
+             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)
  
Fix DATrie support under Python 2.
## Code Before:
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)

## Instruction:
Fix DATrie support under Python 2.
## Code After:
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)
