From ffc1c91a408b0f491d34c78147a8da090ea52547 Mon Sep 17 00:00:00 2001 From: Cameron Neville Date: Sat, 16 Sep 2017 13:34:40 -0400 Subject: [PATCH] first commit --- sring.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 sring.py diff --git a/sring.py b/sring.py new file mode 100644 index 0000000..d78a0b0 --- /dev/null +++ b/sring.py @@ -0,0 +1,71 @@ +class sring: + + #don't mess with defaults when creating a new sring + def __init__(self, dat, size=1, eprev=None, enext=None): + self.dat = dat + self.size = size + if eprev is None: + self.eprev = self + self.enext = self + else: + self.eprev = eprev + self.enext = enext + + def __getitem__(self, index): + return self.rotate(index).dat + + def __delitem__(self, index): + loc = self.rotate(index) + loc.eprev.enext = loc.enext + loc.enext.eprev = loc.eprev + self.propsize(self.size-1) + + def __str__(self): + return str(self.cut()) + + def __len__(self): + return self.size + + def rotate(self, index): + if not isinstance(index, int): + raise TypeError('index must be an integer') + ind = ((index + self.size / 2) % self.size) - self.size / 2 + if ind == 0: + return self + elif ind < 0: + loc = self + while ind != 0: + loc = loc.eprev + ind += 1 + return loc + elif index > 0: + loc = self + while ind != 0: + loc = loc.enext + ind -= 1 + return loc + + #inserts AFTER the given index + def insert(self, dat, index=-1): + target = self.rotate(index) + tarnext = target.enext + enew = sring(dat, eprev=target, enext = tarnext) + target.enext = enew + tarnext.eprev = enew + self.propsize(self.size+1) + + def cut(self, index=0): + loc = self.rotate(index) + data = [loc.dat] + nex = loc.enext + while nex != loc: + data += [nex.dat] + nex = nex.enext + return data + + def propsize(self, nsize): + self.size = nsize + loc = self.enext + while loc != self: + loc.size = nsize + loc = loc.enext