# -*- coding: utf-8 -*-
"""
$Id$

Copyright 2008 Lode Leroy

This file is part of PyCAM.

PyCAM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

PyCAM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with PyCAM.  If not, see <http://www.gnu.org/licenses/>.
"""

class Iterator(object):
    def __init__(self, seq, start=0):
        self.seq = seq
        self.ind = start

    def next(self):
        if self.ind >= len(self.seq):
            return None
        else:
            item = self.seq[self.ind]
            self.ind += 1
            return item

    def insertBefore(self, item):
        self.seq.insert(self.ind - 1, item)
        self.ind += 1

    def insert(self, item):
        self.seq.insert(self.ind, item)
        self.ind += 1

    def replace(self, item_old, item_new):
        for i in range(len(self.seq)):
            if self.seq[i] == item_old:
                self.seq[i] = item_new

    def remove(self, item):
        for i in range(len(self.seq)):
            if self.seq[i] == item:
                del self.seq[i]
                if i < self.ind:
                    self.ind -= 1
                return

    def takeNext(self):
        if self.ind >= len(self.seq):
            return None
        else:
            return self.seq.pop(self.ind)

    def copy(self):
        return Iterator(self.seq, self.ind)

    def peek(self, i=0):
        if self.ind + i >= len(self.seq):
            return None
        else:
            return self.seq[self.ind + i]

    def remains(self):
        return len(self.seq) - self.ind


class CyclicIterator(object):
    def __init__(self, seq, start=0):
        self.seq = seq
        self.ind = start
        self.count = len(seq)

    def next(self):
        item = self.seq[self.ind]
        self.ind += 1
        if self.ind == len(self.seq):
            self.ind = 0
        return item

    def copy(self):
        return CyclicIterator(self.seq, self.ind)

    def peek(self, i=0):
        idx = self.ind + i
        while idx >= len(self.seq):
            idx -= len(self.seq)
        return self.seq[idx]


if __name__ == "__main__":
    l = [1, 2, 4, 6]
    print "l=", l
    i = Iterator(l)
    print i.peek()
    while True:
        val = i.next()
        if val == None:
            break
        if val == 4:
            i.insertBefore(3)
            i.insert(5)

    print "l=", l
    i = Iterator(l)
    print "peek(0)=", i.peek(0)
    print "peek(1)=", i.peek(1)
    print "i.next()=", i.next()
    print "peek(0)=", i.peek(0)
    print "peek(1)=", i.peek(1)

    print "remains=", i.remains()

    print "l=", l
    sum_value = 0
    i = CyclicIterator(l)
    print "cycle :",
    while sum_value < 30:
        val = i.next()
        print val,
        sum_value += val
    print "=", sum_value

    i = Iterator(l)
    print "l=", l
    i.next()
    i.next()
    print "next,next : ", i.peek()
    i.remove(2)
    print "remove(2) : ", i.peek()
    i.remove(4)
    print "remove(4) : ", i.peek()
    print "l=", l

