def and_then(other = Utils::UNDEFINED, &block)
      Utils.with_block_or_argument('Fear::PartialFunction#and_then', other, block) do |fun|
        if fun.is_a?(Fear::PartialFunction)
          Combined.new(self, fun)
        else
          AndThen.new(self, &fun)
        end
      end
    end
def and_then(other = Utils::UNDEFINED, &block)
      Utils.with_block_or_argument('Fear::PartialFunction#and_then', other, block) do |fun|
        if fun.is_a?(Fear::PartialFunction)
          Combined.new(self, fun)
        else
          AndThen.new(self, &fun)
        end
      end
    end
Composes this partial function with a fallback partial function (or Proc) which
 gets applied where this partial function is not defined.

 @overload and_then(other)
   @param other [Fear::PartialFunction]
   @return [Fear::PartialFunction] a partial function with the same domain as this partial function, which maps
     argument +x+ to +other.(self.call(x))+.
   @note calling +#defined_at?+ on the resulting partial function may call the first
     partial function and execute its side effect. It is highly recommended to call +#call_or_else+
     instead of +#defined_at?+/+#call+ for efficiency.
 @overload and_then(other)
   @param other [Proc]
   @return [Fear::PartialFunction] a partial function with the same domain as this partial function, which maps
     argument +x+ to +other.(self.call(x))+.
 @overload and_then(&other)
   @param other [Proc]
   @return [Fear::PartialFunction]