code: def precondition(precond):
      
      def decorator(f):
          """`f` can be a reference to a method or function. In
          both cases the `data` is expected to be passed as the
          first positional argument (obviously respecting the
          `self` argument when it is a method).
          """
          def decorated(*args):
              if len(args) > 2:
                  raise TypeError('%s takes only 1 argument (or 2 for instance methods)' % f.__name__)
  
              try:
                  instance, data = args
                  if not isinstance(instance, Pipe):
                      raise TypeError('%s is not a valid pipe instance' % instance)
  
              except ValueError:  # tuple unpacking error
                  data = args[0]
  
              try:
                  precond(data)
              except UnmetPrecondition:
                  # bypass the pipe
                  return data
              else:
                  return f(*args)
          return decorated
      return decorator
docs: Runs the callable responsible for making some assertions
      about the data structure expected for the transformation.
  
      If the precondition is not achieved, a UnmetPrecondition
      exception must be raised, and then the transformation pipe
      is bypassed.