#!/usr/bin/env python
#coding:utf-8
# Author:  mozman -- <mozman@gmx.at>
# Purpose: TreeSlice
# Created: 11.04.2011
# Copyright (c) 2010-2013 by Manfred Moitzi
# License: MIT License


class TreeSlice(object):
    __slots__ = ['_tree', '_start', '_stop']

    def __init__(self, tree, start, stop):
        self._tree = tree
        self._start = start
        self._stop = stop

    def __repr__(self):
        tpl = "%s({%s})" % (self._tree.__class__.__name__, '%s')
        return tpl % ", ".join( ("%r: %r" % item for item in self.items()) )

    def __contains__(self, key):
        if self._inrange(key):
            return key in self._tree
        else:
            return False

    def _inrange(self, key):
        if self._start is not None and key < self._start:
                return False
        if self._stop is not None and key >= self._stop:
                return False
        return True

    def __getitem__(self, key):
        if isinstance(key, slice):
            return self._subslice(key.start, key.stop)
        if self._inrange(key):
            return self._tree[key]
        else:
            raise KeyError(key)

    def _subslice(self, start, stop):
        def newstart():
            if start is None:
                return self._start
            elif self._start is None:
                return start
            else:
                return max(start, self._start)

        def newstop():
            if stop is None:
                return self._stop
            elif self._stop is None:
                return stop
            else:
                return min(stop, self._stop)

        return TreeSlice(self._tree, newstart(), newstop())

    def keys(self):
        return self._tree.keyslice(self._start, self._stop)
    __iter__ = keys

    def values(self):
        return self._tree.valueslice(self._start, self._stop)

    def items(self):
        return self._tree.itemslice(self._start, self._stop)
