-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Common operators encouraging large-scale easy reading -- -- Op provides operators for writing easier-to-read Haskell. It provides -- new operators with a consistent "look and feel" including fixity -- direction and precedence, resulting in easier- and quicker-to-read -- code especially when used on long chains of expressions. @package op @version 0.2.0.0 -- | Op provides operators for writing easier-to-read Haskell. It provides -- new operators with a consistent "look and feel" including fixity -- direction and precedence, resulting in easier- and quicker-to-read -- code especially when used on long chains of expressions. -- -- All right-facing operators are defined with infixl 1 which is -- the same as >>=, so you can chain all of these together -- without using parentheses. -- -- All left-facing operators are defined with infixr 1 which is -- the same as =<<, so you can chain all of these together -- also without using parentheses. -- -- Unlike Flow and FunctorMonadic we do not restrict -- ourselves to functions and functors respectively, but we try to cover -- as many operators as possible. -- -- This means we conflict with some non-Prelude base operators (search -- "redefined" below), but that is the trade-off we chose. They are used -- less commonly than the ones we retain compatibility with, IOO their -- inconsistency is part of the reason why they are used less commonly, -- and this package tries to fix that. -- --

Examples

-- --
--   >>> :set -XTupleSections
--   
--   >>> import Control.Op
--   
--   >>> import Data.Functor
--   
--   >>> import qualified Data.Map.Strict as M
--   
--   >>> :{
--   data InnerMap k v = InnerMap
--     { innerMeta :: !()
--     , innerMap :: !(M.Map k v)
--     }
--   :}
--   
-- --
--   >>> type MultiMap k v = M.Map Integer (InnerMap k v)
--   
-- -- Old way, needs extra parens due to <$>'s fixity: -- --
--   >>> :{
--   lookupOldR :: Ord k => MultiMap k v -> (Integer, k) -> Maybe (Integer, v)
--   lookupOldR m (i, k) = (i,) <$> (M.lookup k . innerMap =<< M.lookup i m)
--   :}
--   
-- -- or, slightly better but the . innerMap still breaks up the -- LTR flow: -- --
--   >>> :{
--   lookupOldL :: Ord k => MultiMap k v -> (Integer, k) -> Maybe (Integer, v)
--   lookupOldL m (i, k) = M.lookup i m >>= M.lookup k . innerMap <&> (i,)
--   :}
--   
-- -- New way: -- --
--   >>> :{
--   lookupNewR :: Ord k => MultiMap k v -> (Integer, k) -> Maybe (Integer, v)
--   lookupNewR m (i, k) = (i,) <$< M.lookup k =<< innerMap <$< M.lookup i <| m
--   :}
--   
-- --
--   >>> :{
--   lookupNewL :: Ord k => MultiMap k v -> (Integer, k) -> Maybe (Integer, v)
--   lookupNewL m (i, k) = m |> M.lookup i >$> innerMap >>= M.lookup k >$> (i,)
--   :}
--   
module Control.Op -- | LTR function application. -- -- Same as & with a consistent fixity. (|>) :: a -> (a -> b) -> b infixl 1 |> -- | RTL function application. -- -- Same as $ with a consistent fixity. (<|) :: (a -> b) -> a -> b infixr 1 <| -- | LTR function composition. -- -- Same as flip . with a consistent fixity. (.>) :: (a -> b) -> (b -> c) -> a -> c infixl 1 .> -- | RTL function composition. -- -- Same as . with a consistent fixity. (<.) :: (b -> c) -> (a -> b) -> a -> c infixr 1 <. -- | LTR category composition. -- -- This is >>> but with a redefined consistent fixity. (>>>) :: Category f => f a b -> f b c -> f a c infixl 1 >>> -- | RTL category composition. -- -- This is <<<. (<<<) :: Category f => f b c -> f a b -> f a c infixr 1 <<< -- | LTR functor application. -- -- Same as <&> with a consistent fixity. (>$>) :: Functor f => f a -> (a -> b) -> f b infixl 1 >$> -- | RTL functor application. -- -- Same as <$> with a consistent fixity. (<$<) :: Functor f => (a -> b) -> f a -> f b infixr 1 <$< (>>=) :: Monad m => m a -> (a -> m b) -> m b (=<<) :: Monad m => (a -> m b) -> m a -> m b -- | LTR monad composition. -- -- This is >=> but with a redefined consistent fixity. (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c infixl 1 >=> -- | RTL monad composition. -- -- This is <=<. (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c infixr 1 <=<