diff --git a/simple-pipe.cabal b/simple-pipe.cabal
--- a/simple-pipe.cabal
+++ b/simple-pipe.cabal
@@ -2,7 +2,7 @@
 cabal-version:	>= 1.8
 
 name:		simple-pipe
-version:	0.0.0.17
+version:	0.0.0.18
 stability:	Experimental
 author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp>
 maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>
@@ -80,7 +80,7 @@
 source-repository	this
     type:	git
     location:	git://github.com/YoshikuniJujo/simple-pipe.git
-    tag:	simple-pipe-0.0.0.17
+    tag:	simple-pipe-0.0.0.18
 
 library
     hs-source-dirs:	src
diff --git a/src/Data/Pipe.hs b/src/Data/Pipe.hs
--- a/src/Data/Pipe.hs
+++ b/src/Data/Pipe.hs
@@ -2,7 +2,7 @@
 	PackageImports #-}
 
 module Data.Pipe (
-	PipeClass(..), PipeChoice(..), convert,
+	PipeClass(..), PipeChoice(..), (=@=), convert,
 	Pipe, finally, bracket ) where
 
 import Control.Applicative
@@ -15,6 +15,10 @@
 import "monads-tf" Control.Monad.Reader
 import "monads-tf" Control.Monad.Writer
 
+infixr 2 =@=
+infixr 3 =$=
+infixr 4 ++++, ||||
+
 class PipeClass p where
 	runPipe :: Monad m => p i o m r -> m (Maybe r)
 	(=$=) :: Monad m => p a b m x -> p b c m y -> p a c m y
@@ -196,3 +200,19 @@
 
 voidM :: Monad m => m a -> m ()
 voidM = (>> return ())
+
+passResult :: (PipeClass p, Monad m, Monad (p i (Either a r) m)) =>
+	p i a m r -> p i (Either a r) m ()
+passResult s = mapOut Left s >>= yield . Right
+
+recvResult :: (PipeClass p, PipeChoice p, Monad m,
+	Monad (p a o m), Monad (p r o m), Monad (p (Either a r) o m)) =>
+	p a o m r' -> p (Either a r) o m r
+recvResult p =
+	(p >> return undefined) |||| (await >>= maybe (return undefined) return)
+
+
+(=@=) :: (PipeClass p, PipeChoice p, Monad m, Monad (p i (Either a r) m),
+	Monad (p a o m), Monad (p r o m), Monad (p (Either a r) o m)) =>
+	p i a m r -> p a o m r' -> p i o m r
+p1 =@= p2 = passResult p1 =$= recvResult p2
