Lichen

lib/__builtins__/tuple.py

227:3a4ba5788f0f
2016-11-23 Paul Boddie Fixed list and tuple initialisation via their initialisers. Introduced generic string representation support for sequences. Removed superfluous tuple native functions. Added element-setting and size-setting native functions for fragments. Added __setitem__ support for sequences. Added initialisation and serialisation tests for lists and tuples.
     1 #!/usr/bin/env python     2      3 """     4 Tuple objects.     5      6 Copyright (C) 2015, 2016 Paul Boddie <paul@boddie.org.uk>     7      8 This program is free software; you can redistribute it and/or modify it under     9 the terms of the GNU General Public License as published by the Free Software    10 Foundation; either version 3 of the License, or (at your option) any later    11 version.    12     13 This program is distributed in the hope that it will be useful, but WITHOUT    14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    15 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more    16 details.    17     18 You should have received a copy of the GNU General Public License along with    19 this program.  If not, see <http://www.gnu.org/licenses/>.    20 """    21     22 from __builtins__.iterator import listiterator    23 from __builtins__.sequence import sequence    24 import native    25     26 class tuple(sequence):    27     28     "Implementation of tuple."    29     30     def __init__(self, args=None):    31     32         "Initialise the tuple."    33     34         # Reserve an attribute for a fragment reference along with some space    35         # for elements.    36     37         size = args is not None and len(args) or 0    38         self.__data__ = native._list_init(size)    39         native._list_setsize(self, size)    40     41         # Populate the tuple.    42     43         if args is not None:    44             i = 0    45             for arg in args:    46                 native._list_setelement(self, i, arg)    47                 i += 1    48     49     def __getslice__(self, start, end=None):    50     51         "Return a slice starting from 'start', with the optional 'end'."    52     53         return tuple(get_using(sequence.__getslice__, self)(start, end))    54     55     def __len__(self):    56     57         "Return the length of the tuple."    58     59         return native._list_len(self)    60     61     def __add__(self, other): pass    62     63     def __str__(self):    64     65         "Return a string representation."    66     67         return self._str("(", ")")    68     69     __repr__ = __str__    70     71     def __bool__(self):    72     73         "Tuples are true if non-empty."    74     75         return self.__len__() != 0    76     77     def __iter__(self):    78     79         "Return an iterator."    80     81         return listiterator(self)    82     83     # Special implementation methods.    84     85     def __get_single_item__(self, index):    86     87         "Return the item at the normalised (positive) 'index'."    88     89         if index >= len(self):    90             raise IndexError(index)    91     92         return native._list_element(self, index)    93     94     def __set_single_item__(self, index, value):    95     96         "Set at the normalised (positive) 'index' the given 'value'."    97     98         raise TypeError(self)    99    100 # vim: tabstop=4 expandtab shiftwidth=4