{-# LANGUAGE CPP, NoImplicitPrelude, UnicodeSyntax, TypeOperators #-}

module Control.Arrow.Unicode
    ( (⋙)
    , (⋘)
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 608
    , (⁂)
#endif
    , (⧻)
    , (⫴)
    ) where

-------------------------------------------------------------------------------
-- Imports
-------------------------------------------------------------------------------

-- from base:
import Control.Arrow ( Arrow, (***), ArrowChoice, (+++), (|||) )
import Data.Either   ( Either )

#if (MIN_VERSION_base(3,0,3))
-- from base-unicode-symbols
import Control.Category.Unicode ( (⋙), (⋘) )
#else
import Control.Arrow ( (>>>), (<<<) )
#endif


-------------------------------------------------------------------------------
-- Fixities
-------------------------------------------------------------------------------

#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 608
infixr 3 
#endif
infixr 2 
infixr 2 
#if ! (MIN_VERSION_base(3,0,3))
infixr 1 , 
#endif


-------------------------------------------------------------------------------
-- Symbols
-------------------------------------------------------------------------------

#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 608
{-|
(&#x2042;) = ('***')

U+2042, ASTERISM
-}
(⁂)  Arrow a  a α β  a α' β'  a (α, α') (β, β')
⁂ :: forall (a :: * -> * -> *) α β α' β'.
Arrow a =>
a α β -> a α' β' -> a (α, α') (β, β')
(⁂) = a α β -> a α' β' -> a (α, α') (β, β')
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
(***)
{-# INLINE () #-}
#endif

{-|
(&#x29FB;) = ('+++')

U+29FB, TRIPLE PLUS
-}
(⧻)  ArrowChoice a  a α β  a α' β'  a (Either α α') (Either β β')
⧻ :: forall (a :: * -> * -> *) α β α' β'.
ArrowChoice a =>
a α β -> a α' β' -> a (Either α α') (Either β β')
(⧻) = a α β -> a α' β' -> a (Either α α') (Either β β')
forall (a :: * -> * -> *) b c b' c'.
ArrowChoice a =>
a b c -> a b' c' -> a (Either b b') (Either c c')
(+++)
{-# INLINE () #-}

{-|
(&#x2AF4;) = ('|||')

U+2AF4, TRIPLE VERTICAL BAR BINARY RELATION
-}
(⫴)  ArrowChoice a  a α δ  a β δ  a (Either α β) δ
⫴ :: forall (a :: * -> * -> *) α δ β.
ArrowChoice a =>
a α δ -> a β δ -> a (Either α β) δ
(⫴) = a α δ -> a β δ -> a (Either α β) δ
forall (a :: * -> * -> *) b d c.
ArrowChoice a =>
a b d -> a c d -> a (Either b c) d
(|||)
{-# INLINE () #-}

#if ! (MIN_VERSION_base(3,0,3))
{-|
(&#x22D9;) = ('>>>')

U+22D9, VERY MUCH GREATER-THAN
-}
()  Arrow a  a α β  a β γ  a α γ
() = (>>>)
{-# INLINE () #-}

{-|
(&#x22D8;) = ('<<<')

U+22D8, VERY MUCH LESS-THAN
-}
()  Arrow a  a β γ  a α β  a α γ
() = (<<<)
{-# INLINE () #-}
#endif