docs: def side_task(pipe, *side_jobs):
      ''' allows you to run a function in a pipeline without affecting the data '''
      # validate the input
      assert iterable(pipe), 'side_task needs the first argument to be iterable'
      for sj in side_jobs:
          assert callable(sj), 'all side_jobs need to be functions, not {}'.format(sj)
      # add a pass through function to side_jobs
      side_jobs = (lambda i:i ,) + side_jobs
      # run the pipeline
      for i in map(pipe, *side_jobs):
          yield i[0]