content: > {-# LANGUAGE CPP, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts #-}
  
  > module Control.Arrow.ArrowP where
  
  > import Control.Arrow
  > import Control.Arrow.Operations
  #if __GLASGOW_HASKELL__ >= 610
  > import Control.Category
  > import Prelude hiding ((.), id)
  #endif
  
  > newtype ArrowP a p b c = ArrowP { strip :: a b c }
  
  #if __GLASGOW_HASKELL__ >= 610
  > instance Category a => Category (ArrowP a p) where
  >   id = ArrowP id
  >   ArrowP g . ArrowP f = ArrowP (g . f)
  
  > instance Arrow a => Arrow (ArrowP a p) where
  >   arr f = ArrowP (arr f)
  >   first (ArrowP f) = ArrowP (first f)
  #else
  > instance Arrow a => Arrow (ArrowP a p) where
  >   arr f = ArrowP (arr f)
  >   first (ArrowP f) = ArrowP (first f)
  >   ArrowP f >>> ArrowP g = ArrowP (f >>> g)
  #endif
  
  > instance ArrowLoop a => ArrowLoop (ArrowP a p) where
  >   loop (ArrowP f) = ArrowP (loop f)
  
  > instance ArrowCircuit a => ArrowCircuit (ArrowP a p) where
  >   delay i = ArrowP (delay i)
  
  > instance ArrowChoice a => ArrowChoice (ArrowP a p) where
  >   left (ArrowP f) = ArrowP (left f)
  >   ArrowP f ||| ArrowP g = ArrowP (f ||| g)
  
  