# Control.Arrow

interface Arrow
  arrow : Arrow arr => (a -> b) -> arr a b
  first : Arrow arr => arr a b -> arr (a, c) (b, c)
  second : Arrow arr => arr a b -> arr (c, a) (c, b)
  (***) : Arrow arr => arr a b -> arr a' b' -> arr (a, a') (b, b')
    Fixity
      Left associative, precedence 3
  (&&&) : Arrow arr => arr a b -> arr a b' -> arr a (b, b')
    Fixity
      Left associative, precedence 3
interface ArrowApply
  app : ArrowApply arr => arr (arr a b, a) b
interface ArrowChoice
  left : ArrowChoice arr => arr a b -> arr (Either a c) (Either b c)
  right : ArrowChoice arr => arr a b -> arr (Either c a) (Either c b)
  (+++) : ArrowChoice arr => arr a b -> arr c d -> arr (Either a c) (Either b d)
    Fixity
      Left associative, precedence 2
  (\|/) : ArrowChoice arr => arr a b -> arr c b -> arr (Either a c) b
    Fixity
      Left associative, precedence 2
interface ArrowLoop
  loop : ArrowLoop arr => arr (a, c) (b, c) -> arr a b
data ArrowMonad : (Type -> Type -> Type) -> Type -> Type
  MkArrowMonad : (runArrowMonad : arr (the Type ()) a) -> ArrowMonad arr a
interface ArrowPlus
  (<++>) : ArrowPlus arr => arr a b -> arr a b -> arr a b
    Fixity
      Left associative, precedence 5
interface ArrowZero
  zeroArrow : ArrowZero arr => arr a b
default#&&& : Arrow arr => arr a b -> arr a b' -> arr a (b, b')
default#*** : Arrow arr => arr a b -> arr a' b' -> arr (a, a') (b, b')
default#+++ : ArrowChoice arr => arr a b -> arr c d -> arr (Either a c) (Either b d)
default#\|/ : ArrowChoice arr => arr a b -> arr c b -> arr (Either a c) b
default#right : ArrowChoice arr => arr a b -> arr (Either c a) (Either c b)
default#second : Arrow arr => arr a b -> arr (c, a) (c, b)
runArrowMonad : ArrowMonad arr a -> arr (the Type ()) a