diff --git a/TypeCompose.cabal b/TypeCompose.cabal
--- a/TypeCompose.cabal
+++ b/TypeCompose.cabal
@@ -1,5 +1,5 @@
 Name:                TypeCompose
-Version:             0.6.8
+Version:             0.7.0
 Synopsis: 	     Type composition classes & instances
 Category:            Composition, Control
 Description:
@@ -8,7 +8,7 @@
   .
   Please see the project wiki page: <http://haskell.org/haskellwiki/TypeCompose>
   .
-  &#169; 2007 by Conal Elliott; BSD3 license.
+  &#169; 2007-2010 by Conal Elliott; BSD3 license.
 Author:              Conal Elliott 
 Maintainer:          conal@conal.net
 Homepage:            http://haskell.org/haskellwiki/TypeCompose
diff --git a/src/Control/Compose.hs b/src/Control/Compose.hs
--- a/src/Control/Compose.hs
+++ b/src/Control/Compose.hs
@@ -25,7 +25,11 @@
 ----------------------------------------------------------------------
 
 module Control.Compose
-  ( Unop, Binop
+  ( 
+  -- * Value transformers
+    Unop, Binop
+  -- * Specialized semantic editor combinators
+  , result, argument, (~>)
   -- * Contravariant functors
   , Cofunctor(..), bicomap
   -- * Unary\/unary composition
@@ -88,8 +92,9 @@
 infixl 0 $*
 infixr 3 ***#
 
+
 {----------------------------------------------------------
-    Misc
+    Value transformers
 ----------------------------------------------------------}
 
 -- |Unary functions
@@ -98,6 +103,35 @@
 type Binop a = a -> a -> a
 
 
+{--------------------------------------------------------------------
+    Semantic editor combinators, specialized to functions.
+    See http://conal.net/blog/posts/semantic-editor-combinators/.
+    Also the DeepArrow package.
+--------------------------------------------------------------------}
+
+-- | Add pre-processing
+argument :: (a' -> a) -> ((a -> b) -> (a' -> b))
+argument = flip (.)
+
+-- | Add post-processing
+result :: (b -> b') -> ((a -> b) -> (a -> b'))
+result = (.)
+
+infixr 1 ~>
+-- | Add pre- and post processing
+(~>) :: (a' -> a) -> (b -> b') -> ((a -> b) -> (a' -> b'))
+-- (f ~> h) g = h . g . f
+f ~> h = result h . argument f
+
+-- More generally,
+-- 
+-- (~>) :: Category (-->) => (a' --> a) -> (b --> b') -> ((a --> b) -> (a' --> b'))
+
+-- If I add argument back to DeepArrow, we can get a different generalization:
+-- 
+-- (~>) :: DeepArrow (-->) => (a' --> a) -> (b --> b') -> ((a -> b) --> (a' -> b'))
+
+
 {----------------------------------------------------------
     Contravariant functors
 ----------------------------------------------------------}
@@ -190,24 +224,17 @@
 
 -- | Apply a unary function within the 'O' constructor.
 inO :: (g (f a) -> g' (f' a')) -> ((g :. f) a -> (g' :. f') a')
-inO = (O .).(. unO)
-
--- inO h (O gfa) = O (h gfa)
--- inO h = O . h . unO
+inO = unO ~> O
 
 -- | Apply a binary function within the 'O' constructor.
 inO2 :: (g (f a)   -> g' (f' a')   -> g'' (f'' a''))
      -> ((g :. f) a -> (g' :. f') a' -> (g'' :. f'') a'')
-inO2 = (inO .).(.unO)
-
--- inO2 h (O gfa) (O gfa') = O (h gfa gfa')
--- inO2 h (O gfa) = inO (h gfa)
+inO2 = unO ~> inO
 
 -- | Apply a ternary function within the 'O' constructor.
 inO3 :: (g (f a)   -> g' (f' a')   -> g'' (f'' a'')   -> g''' (f''' a'''))
      -> ((g :. f) a -> (g' :. f') a' -> (g'' :. f'') a'' -> (g''' :. f''') a''')
-inO3 = (inO2 .).(.unO)
--- inO3 h (O gfa) = inO2 (h gfa)
+inO3 = unO ~> inO2
 
 
 -- | Handy combination of 'O' and 'pure'.
@@ -399,7 +426,7 @@
 -- | Apply unary function in side a 'FunA' representation.
 inFunA :: ((h a -> h b) -> (h' a' -> h' b'))
        -> (FunA h a b -> FunA h' a' b')
-inFunA = (FunA .).(. unFunA)
+inFunA = unFunA ~> FunA
 
 -- | Apply binary function in side a 'FunA' representation.
 inFunA2 :: ((h a -> h b) -> (h' a' -> h' b') -> (h'' a'' -> h'' b''))
@@ -471,7 +498,7 @@
 
 -- Apply unary function inside of a 'Flip' representation.
 inFlip :: ((a~>b) -> (a' ~~> b')) -> (Flip (~>) b a -> Flip (~~>) b' a')
-inFlip = (Flip .).(. unFlip)
+inFlip = unFlip ~> Flip
 
 -- Apply binary function inside of a 'Flip' representation.
 inFlip2 :: ((a~>b) -> (a' ~~> b') -> (a'' ~~~> b''))
@@ -529,7 +556,7 @@
 
 -- Apply unary function inside of an 'App representation.
 inApp :: (f a -> f' a') -> (App f a -> App f' a')
-inApp = (App .).(. unApp)
+inApp = unApp ~> App
 
 -- Apply binary function inside of a 'App' representation.
 inApp2 :: (f a -> f' a' -> f'' a'') -> (App f a -> App f' a' -> App f'' a'')
@@ -553,7 +580,7 @@
 newtype Id a = Id { unId :: a }
 
 inId :: (a -> b) -> (Id a -> Id b)
-inId = (Id .).(. unId)
+inId = unId ~> Id
 
 inId2 :: (a -> b -> c) -> (Id a -> Id b -> Id c)
 inId2 f (Id a) = inId (f a)
@@ -601,7 +628,7 @@
 -- | Apply unary function inside of @f :*: g@ representation.
 inProd :: ((f a, g a) -> (f' a', g' a'))
        -> ((f :*: g) a -> (f' :*: g') a')
-inProd = (Prod .).(. unProd)
+inProd = unProd ~> Prod
 
 -- | Apply binary function inside of @f :*: g@ representation.
 inProd2 :: ((f a, g a) -> (f' a', g' a') -> (f'' a'', g'' a''))
@@ -665,7 +692,7 @@
 -- | Apply binary function inside of @f :*: g@ representation.
 inProdd :: ((f a b, g a b) -> (f' a' b', g' a' b'))
         -> ((f ::*:: g) a b -> (f' ::*:: g') a' b')
-inProdd = (Prodd  .).(. unProdd)
+inProdd = unProdd ~> Prodd
 
 -- | Apply binary function inside of @f :*: g@ representation.
 inProdd2 :: ((f a b, g a b) -> (f' a' b', g' a' b') -> (f'' a'' b'', g'' a'' b''))
@@ -714,7 +741,7 @@
 -- | Apply unary function inside of @Arrw@ representation.
 inArrw :: ((f a ~> g a) -> (f' a' ~> g' a'))
        -> ((Arrw (~>) f g) a -> (Arrw (~>) f' g') a')
-inArrw = (Arrw .).(. unArrw)
+inArrw = unArrw ~> Arrw
 
 -- | Apply binary function inside of @Arrw (~>) f g@ representation.
 inArrw2 :: ((f a ~> g a) -> (f' a' ~> g' a') -> (f'' a'' ~> g'' a''))
@@ -766,8 +793,8 @@
 biConst :: a :<->: Const a b
 biConst = Bi Const getConst
 
-inConst :: (a -> b) -> Const a u -> Const b v
-inConst = (Const .).(. getConst)
+inConst :: (a -> b) -> (Const a u -> Const b v)
+inConst = getConst ~> Const
 
 inConst2 :: (a -> b -> c) -> Const a u -> Const b v -> Const c w
 inConst2 f (Const a) = inConst (f a)
diff --git a/src/Data/Title.hs b/src/Data/Title.hs
--- a/src/Data/Title.hs
+++ b/src/Data/Title.hs
@@ -64,3 +64,5 @@
 -- Equivalently,
 -- 
 --   title_f str (Flip snk) = Flip (title str snk)
+
+-- TODO: Generalize the Title_f instance to other arrows.
