module Foundation.Collection.Mappable
( Mappable(..)
, sequence_
, traverse_
, mapM_
, forM
, forM_
) where
import Basement.Compat.Base
import qualified Data.Traversable
import Basement.BoxedArray (Array)
class Functor collection => Mappable collection where
{-# MINIMAL traverse | sequenceA #-}
traverse :: Applicative f => (a -> f b)
-> collection a
-> f (collection b)
traverse a -> f b
f = forall (collection :: * -> *) (f :: * -> *) a.
(Mappable collection, Applicative f) =>
collection (f a) -> f (collection a)
sequenceA forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> f b
f
sequenceA :: Applicative f => collection (f a)
-> f (collection a)
sequenceA = forall (collection :: * -> *) (f :: * -> *) a b.
(Mappable collection, Applicative f) =>
(a -> f b) -> collection a -> f (collection b)
traverse forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
mapM :: (Applicative m, Monad m) => (a -> m b) -> collection a -> m (collection b)
mapM = forall (collection :: * -> *) (f :: * -> *) a b.
(Mappable collection, Applicative f) =>
(a -> f b) -> collection a -> f (collection b)
traverse
sequence :: (Applicative m, Monad m) => collection (m a) -> m (collection a)
sequence = forall (collection :: * -> *) (f :: * -> *) a.
(Mappable collection, Applicative f) =>
collection (f a) -> f (collection a)
sequenceA
traverse_ :: (Mappable col, Applicative f) => (a -> f b) -> col a -> f ()
traverse_ :: forall (col :: * -> *) (f :: * -> *) a b.
(Mappable col, Applicative f) =>
(a -> f b) -> col a -> f ()
traverse_ a -> f b
f col a
col = forall (collection :: * -> *) (f :: * -> *) a b.
(Mappable collection, Applicative f) =>
(a -> f b) -> collection a -> f (collection b)
traverse a -> f b
f col a
col forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
mapM_ :: (Mappable col, Applicative m, Monad m) => (a -> m b) -> col a -> m ()
mapM_ :: forall (col :: * -> *) (m :: * -> *) a b.
(Mappable col, Applicative m, Monad m) =>
(a -> m b) -> col a -> m ()
mapM_ a -> m b
f col a
c = forall (collection :: * -> *) (m :: * -> *) a b.
(Mappable collection, Applicative m, Monad m) =>
(a -> m b) -> collection a -> m (collection b)
mapM a -> m b
f col a
c forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return ()
sequence_ :: (Mappable col, Applicative m, Monad m) => col (m a) -> m ()
sequence_ :: forall (col :: * -> *) (m :: * -> *) a.
(Mappable col, Applicative m, Monad m) =>
col (m a) -> m ()
sequence_ col (m a)
c = forall (collection :: * -> *) (m :: * -> *) a.
(Mappable collection, Applicative m, Monad m) =>
collection (m a) -> m (collection a)
sequence col (m a)
c forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (m :: * -> *) a. Monad m => a -> m a
return ()
forM :: (Mappable col, Applicative m, Monad m) => col a -> (a -> m b) -> m (col b)
forM :: forall (col :: * -> *) (m :: * -> *) a b.
(Mappable col, Applicative m, Monad m) =>
col a -> (a -> m b) -> m (col b)
forM = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (collection :: * -> *) (m :: * -> *) a b.
(Mappable collection, Applicative m, Monad m) =>
(a -> m b) -> collection a -> m (collection b)
mapM
forM_ :: (Mappable col, Applicative m, Monad m) => col a -> (a -> m b) -> m ()
forM_ :: forall (col :: * -> *) (m :: * -> *) a b.
(Mappable col, Applicative m, Monad m) =>
col a -> (a -> m b) -> m ()
forM_ = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (col :: * -> *) (m :: * -> *) a b.
(Mappable col, Applicative m, Monad m) =>
(a -> m b) -> col a -> m ()
mapM_
instance Mappable [] where
{-# INLINE traverse #-}
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse = forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
Data.Traversable.traverse
instance Mappable Array where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Array a -> f (Array b)
traverse a -> f b
f Array a
arr = forall l. IsList l => [Item l] -> l
fromList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (collection :: * -> *) (f :: * -> *) a b.
(Mappable collection, Applicative f) =>
(a -> f b) -> collection a -> f (collection b)
traverse a -> f b
f (forall l. IsList l => l -> [Item l]
toList Array a
arr)