#!/usr/bin/env python
"""
CS 3500 Lab 10
Andrew Oliveros

Execute with:

     ./lab10.py lab10.data

lab10.data is structured like this:

      10
      15
      20
      0
      17
      """

      from sys import argv

"""  
my_map takes a function and a list, and returns the result of the
function applied to the every element in the list; e.g.,

    my_map(lambda x: x + 1, [1, 2, 3]) 

returns [2, 3, 4]
"""

def my_map(func, list):
  new_list = []
  for item in list:
    new_list.append(func(item))
    return new_list

    def my_filter(func, list):
      new_list = []
      for item in list:
        if func(item):
          new_list.append(item)
          return new_list

          def my_mean(func, list):
            count=0
            sum=0.0
            for item in list:
              if func(item):
                count = count + 1
                sum = sum+item
                return sum/count 
#
import sys
def printjob(entry):  
 n,x = entry
 buf = n + "," + str(x) + " "
 sys.stdout.write(buf) 

# consumer
def consumer(jobs):
  sys.stdout.write("Consumer starting.\n")
  i = -1 

  while jobs:
    i = (i + 1) % len(jobs)
    n,t = jobs[i]
    getRequest = yield jobs[i]
    if getRequest:
      request, name, jobno = getRequest

      if request == "add":
        entry = name,jobno
        jobs.append(entry)
        sys.stdout.write("\nADD ") 

      else if request == "remove":
        entry = name,jobno
        if entry in jobs:
          jobs.remove(entry)
          buf = "\nREMOVE " + name + "\n"
          sys.stdout.write(buf)

#producer
def producer(jobs):
  sys.stdout.write("Producer starting.\n")
  c = consumer(jobs)

  for i in range(len(jobs)):
    printjob(c.next())

    printjob(c.send(("add","iron",44)))
    for i in range(len(jobs)):
      printjob(c.next())  

      c.send(("remove","iron",44))
      for i in range(len(jobs)):
        printjob(c.next())

        print "\nProducer Done."

#part 2
if len(argv) < 2:
  print "Usage: %s <filename>" % argv[0]
else:
  input = file(argv[1])
  values = []
  for line in input:
   values.append(int(line))

   squared = my_map(lambda x: x * x, values)
   mean = my_mean(lambda x: x > 0, values)
   successor = my_map(lambda x: x + 1, values)
   filtered = my_filter(lambda x: (x % 2) != 0, values)

   print "PART I" 
   print "original list: ", values 
   print "odds:   " , filtered 
   print "squared:" , squared
   print "mean:   " , mean 
   print "squared: " squared
   print successor

   print "PART II."
   n = 0

   if len(sys.argv) == 3:
     offset = sys.argv[2]
     n = int(offset)

if __name__ == "__main__":

jobs = [("wash",11+n),("dry",22+n),("fold",33+n)]
   producer(jobs)