{-# LANGUAGE Trustworthy #-} {-# LANGUAGE NoImplicitPrelude #-} {-# OPTIONS_GHC -Wno-inline-rule-shadowing #-} -- The RULES for the methods of class Arrow may never fire -- e.g. compose/arr; see Trac #10528 ----------------------------------------------------------------------------- -- | -- Module : Control.Arrow -- Copyright : (c) Ross Paterson 2002 -- License : BSD-style (see the LICENSE file in the distribution) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : portable -- -- Basic arrow definitions, based on -- -- * /Generalising Monads to Arrows/, by John Hughes, -- /Science of Computer Programming/ 37, pp67-111, May 2000. -- -- plus a couple of definitions ('returnA' and 'loop') from -- -- * /A New Notation for Arrows/, by Ross Paterson, in /ICFP 2001/, -- Firenze, Italy, pp229-240. -- -- These papers and more information on arrows can be found at -- <http://www.haskell.org/arrows/>. module Control.Arrow ( -- * Arrows Arrow(..), Kleisli(..), -- ** Derived combinators returnA, (^>>), (>>^), (>>>), (<<<), -- reexported -- ** Right-to-left variants (<<^), (^<<), -- * Monoid operations ArrowZero(..), ArrowPlus(..), -- * Conditionals ArrowChoice(..), -- * Arrow application ArrowApply(..), ArrowMonad(..), leftApp, -- * Feedback ArrowLoop(..) ) where import Data.Tuple ( fst, snd, uncurry ) import Data.Either import Control.Monad.Fix import Control.Category import GHC.Base hiding ( (.), id ) infixr 5 <+> infixr 3 *** infixr 3 &&& infixr 2 +++ infixr 2 ||| infixr 1 ^>>, >>^ infixr 1 ^<<, <<^ -- | The basic arrow class. -- -- Instances should satisfy the following laws: -- -- * @'arr' id = 'id'@ -- -- * @'arr' (f >>> g) = 'arr' f >>> 'arr' g@ -- -- * @'first' ('arr' f) = 'arr' ('first' f)@ -- -- * @'first' (f >>> g) = 'first' f >>> 'first' g@ -- -- * @'first' f >>> 'arr' 'fst' = 'arr' 'fst' >>>