module Pandora.Pattern.Functor.Traversable (Traversable (..)) where
import Pandora.Core.Functor (type (:.:), type (><))
import Pandora.Core.Morphism (identity, (.))
import Pandora.Pattern.Functor.Covariant (Covariant)
import Pandora.Pattern.Functor.Applicative (Applicative)
import Pandora.Pattern.Functor.Pointable (Pointable)
infixl 5 ->>, ->>>, ->>>>, ->>>>>
class Covariant t => Traversable t where
{-# MINIMAL (->>) #-}
(->>) :: (Pointable u, Applicative u) => t a -> (a -> u b) -> u :.: t >< b
traverse :: (Pointable u, Applicative u) => (a -> u b) -> t a -> u :.: t >< b
traverse f t = t ->> f
sequence :: (Pointable u, Applicative u) => (t :.: u) a -> u :.: t >< a
sequence t = t ->> identity
(->>>) :: (Pointable u, Applicative u, Traversable v)
=> v :.: t >< a -> (a -> u b) -> u :.: v :.: t >< b
x ->>> f = (traverse . traverse) f x
(->>>>) :: (Pointable u, Applicative u, Traversable v, Traversable w)
=> w :.: v :.: t >< a -> (a -> u b) -> u :.: w :.: v :.: t >< b
x ->>>> f = (traverse . traverse . traverse) f x
(->>>>>) :: (Pointable u, Applicative u, Traversable v, Traversable w, Traversable j)
=> j :.: w :.: v :.: t >< a -> (a -> u b) -> u :.: j :.: w :.: v :.: t >< b
x ->>>>> f = (traverse . traverse . traverse . traverse) f x