module Grisette.Unified.Lib.Data.Functor
( mrgFmap,
(.<$),
(.$>),
(.<$>),
(.<&>),
mrgUnzip,
mrgVoid,
)
where
import Control.Monad (void)
import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)
import Grisette.Internal.Core.Data.Class.TryMerge (TryMerge, tryMerge)
mrgFmap ::
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) ->
f a ->
f b
mrgFmap :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
mrgFmap a -> b
f f a
a = f b -> f b
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (f b -> f b) -> f b -> f b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> f a -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f (f a -> f a
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge f a
a)
{-# INLINE mrgFmap #-}
infixl 4 .<$>
(.<$>) ::
(TryMerge f, Mergeable a, Mergeable b, Functor f) => (a -> b) -> f a -> f b
.<$> :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
(.<$>) = (a -> b) -> f a -> f b
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
mrgFmap
{-# INLINE (.<$>) #-}
infixl 4 .<$
(.<$) :: (TryMerge f, Mergeable a, Mergeable b, Functor f) => b -> f a -> f b
.<$ :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
b -> f a -> f b
(.<$) b
v f a
f = f b -> f b
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (f b -> f b) -> f b -> f b
forall a b. (a -> b) -> a -> b
$ b
v b -> f a -> f b
forall a b. a -> f b -> f a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f a -> f a
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge f a
f
{-# INLINE (.<$) #-}
infixl 4 .$>
(.$>) :: (TryMerge f, Mergeable a, Mergeable b, Functor f) => f a -> b -> f b
.$> :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
f a -> b -> f b
(.$>) = (b -> f a -> f b) -> f a -> b -> f b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> f a -> f b
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
b -> f a -> f b
(.<$)
{-# INLINE (.$>) #-}
infixl 1 .<&>
(.<&>) ::
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
f a ->
(a -> b) ->
f b
.<&> :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
f a -> (a -> b) -> f b
(.<&>) = ((a -> b) -> f a -> f b) -> f a -> (a -> b) -> f b
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> b) -> f a -> f b
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
mrgFmap
{-# INLINE (.<&>) #-}
mrgUnzip ::
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
f (a, b) ->
(f a, f b)
mrgUnzip :: forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
f (a, b) -> (f a, f b)
mrgUnzip f (a, b)
ab =
let mergedAb :: f (a, b)
mergedAb = f (a, b) -> f (a, b)
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge f (a, b)
ab
in ((a, b) -> a
forall a b. (a, b) -> a
fst ((a, b) -> a) -> f (a, b) -> f a
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
.<$> f (a, b)
mergedAb, (a, b) -> b
forall a b. (a, b) -> b
snd ((a, b) -> b) -> f (a, b) -> f b
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
.<$> f (a, b)
mergedAb)
{-# INLINE mrgUnzip #-}
mrgVoid :: (TryMerge f, Functor f) => f a -> f ()
mrgVoid :: forall (f :: * -> *) a. (TryMerge f, Functor f) => f a -> f ()
mrgVoid f a
x = f () -> f ()
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (f () -> f ()) -> f () -> f ()
forall a b. (a -> b) -> a -> b
$ f a -> f ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void f a
x
{-# INLINE mrgVoid #-}