code: def _ufunc_helper(lhs, rhs, fn_array, fn_scalar, lfn_scalar, rfn_scalar=None):
      
      if isinstance(lhs, numeric_types):
          if isinstance(rhs, numeric_types):
              return fn_scalar(lhs, rhs)
          else:
              if rfn_scalar is None:
                  # commutative function
                  return lfn_scalar(rhs, float(lhs))
              else:
                  return rfn_scalar(rhs, float(lhs))
      elif isinstance(rhs, numeric_types):
          return lfn_scalar(lhs, float(rhs))
      elif isinstance(rhs, NDArray):
          return fn_array(lhs, rhs)
      else:
          raise TypeError('type %s not supported' % str(type(rhs)))
docs: Helper function for element-wise operation.
      The function will perform numpy-like broadcasting if needed and call different functions.
  
      Parameters
      --------
      lhs : NDArray or numeric value
          Left-hand side operand.
  
      rhs : NDArray or numeric value
          Right-hand operand,
  
      fn_array : function
          Function to be called if both lhs and rhs are of ``NDArray`` type.
  
      fn_scalar : function
          Function to be called if both lhs and rhs are numeric values.
  
      lfn_scalar : function
          Function to be called if lhs is ``NDArray`` while rhs is numeric value
  
      rfn_scalar : function
          Function to be called if lhs is numeric value while rhs is ``NDArray``;
          if none is provided, then the function is commutative, so rfn_scalar is equal to lfn_scalar
  
      Returns
      --------
      NDArray
          result array