#!/usr/bin/env python
##  $Id: abstfilter.py,v 1.1.1.1 2003/07/01 23:28:27 euske Exp $
##
##  abstfilter.py - A framework for cascade filters.
##
##  from http://www.unixuser.org/~euske/python/index.html:
##  The following files are in public domain except where otherwise noted. THESE FILES COME WITH ABSOLUTELY NO WARRANTY.


##  AbstractFeeder
##
class AbstractFeeder(object):

  def __init__(self, next_filter):
    self.next_filter = next_filter
    return

  def feed_next(self, s):
    self.next_filter.feed(s)
    return

  def close(self):
    self.next_filter.close()
    return


##  AbstractFilter
##
class AbstractFilter(object):

  def __init__(self, next_filter):
    self.next_filter = next_filter
    return

  def process(self, s):
    raise NotImplementedError
  
  def feed(self, s):
    self.feed_next(self.process(s))
    return

  def feed_next(self, s):
    self.next_filter.feed(s)
    return

  def close(self):
    self.next_filter.close()
    return


##  AbstractConsumer
##
class AbstractConsumer(object):

  def __init__(self):
    return

  def feed(self, s):
    raise NotImplementedError
  
  def close(self):
    return


##  FileGenerator
##
class FileGenerator(AbstractFeeder):
  def __init__(self, next_type):
    next_filter = next_type(self)
    AbstractFeeder.__init__(self, next_filter)
    self.results = []
    return
  
  def feed(self, s):
    self.results.append(s)
    return

  def close(self):
    return
  
  def pullopen(self, f):
    while 1:
      s = f.readline()
      if not s: break
      self.feed_next(s)
      if self.results:
        for s in self.results:
          yield s
        self.results = []
    for s in self.results:
      yield s
    self.results = []
    return

