{-# LANGUAGE CPP #-}
{-# LANGUAGE ConstraintKinds #-}
module Grisette.Internal.Internal.Decl.Core.Data.Class.TryMerge
( TryMerge (..),
tryMerge,
MonadTryMerge,
mrgSingle,
mrgSingleWithStrategy,
mrgToSym,
toUnionSym,
)
where
import Grisette.Internal.Internal.Decl.Core.Data.Class.Mergeable
( Mergeable (rootStrategy),
MergingStrategy,
)
import Grisette.Internal.Internal.Decl.Core.Data.Class.ToSym (ToSym (toSym))
class TryMerge m where
tryMergeWithStrategy :: MergingStrategy a -> m a -> m a
tryMerge :: (TryMerge m, Mergeable a) => m a -> m a
tryMerge :: forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge = MergingStrategy a -> m a -> m a
forall a. MergingStrategy a -> m a -> m a
forall (m :: * -> *) a.
TryMerge m =>
MergingStrategy a -> m a -> m a
tryMergeWithStrategy MergingStrategy a
forall a. Mergeable a => MergingStrategy a
rootStrategy
{-# INLINE tryMerge #-}
mrgSingleWithStrategy ::
(TryMerge m, Applicative m) =>
MergingStrategy a ->
a ->
m a
mrgSingleWithStrategy :: forall (m :: * -> *) a.
(TryMerge m, Applicative m) =>
MergingStrategy a -> a -> m a
mrgSingleWithStrategy MergingStrategy a
strategy = MergingStrategy a -> m a -> m a
forall a. MergingStrategy a -> m a -> m a
forall (m :: * -> *) a.
TryMerge m =>
MergingStrategy a -> m a -> m a
tryMergeWithStrategy MergingStrategy a
strategy (m a -> m a) -> (a -> m a) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
{-# INLINE mrgSingleWithStrategy #-}
mrgSingle :: (TryMerge m, Applicative m, Mergeable a) => a -> m a
mrgSingle :: forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgSingle = MergingStrategy a -> a -> m a
forall (m :: * -> *) a.
(TryMerge m, Applicative m) =>
MergingStrategy a -> a -> m a
mrgSingleWithStrategy MergingStrategy a
forall a. Mergeable a => MergingStrategy a
rootStrategy
{-# INLINE mrgSingle #-}
type MonadTryMerge f = (TryMerge f, Monad f)
mrgToSym ::
(ToSym a b, Mergeable b, TryMerge m, Applicative m) =>
a ->
m b
mrgToSym :: forall a b (m :: * -> *).
(ToSym a b, Mergeable b, TryMerge m, Applicative m) =>
a -> m b
mrgToSym = a -> m b
forall a b (m :: * -> *).
(ToSym a b, Mergeable b, TryMerge m, Applicative m) =>
a -> m b
toUnionSym
{-# INLINE mrgToSym #-}
toUnionSym ::
(ToSym a b, Mergeable b, TryMerge m, Applicative m) =>
a ->
m b
toUnionSym :: forall a b (m :: * -> *).
(ToSym a b, Mergeable b, TryMerge m, Applicative m) =>
a -> m b
toUnionSym = m b -> m b
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (m b -> m b) -> (a -> m b) -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> m b
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b -> m b) -> (a -> b) -> a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
forall a b. ToSym a b => a -> b
toSym
{-# INLINE toUnionSym #-}