{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy #-}
module Grisette.Lib.Data.Foldable
( symElem,
symMaximum,
mrgMaximum,
symMinimum,
mrgMinimum,
mrgFoldrM,
mrgFoldlM,
mrgTraverse_,
mrgFor_,
mrgSequenceA_,
mrgAsum,
mrgMapM_,
mrgForM_,
mrgSequence_,
mrgMsum,
symAnd,
symOr,
symAny,
symAll,
symMaximumBy,
mrgMaximumBy,
symMinimumBy,
mrgMinimumBy,
symNotElem,
mrgFind,
)
where
import Control.Monad (MonadPlus)
import Data.Foldable (Foldable (foldl'))
import Grisette.Internal.Core.Control.Monad.Union (MonadUnion)
import Grisette.Internal.Core.Control.Monad.UnionM (UnionM, liftUnionM)
import Grisette.Internal.Core.Data.Class.ITEOp (ITEOp)
import Grisette.Internal.Core.Data.Class.LogicalOp (LogicalOp (symNot, (.&&), (.||)))
import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)
import Grisette.Internal.Core.Data.Class.PlainUnion (symIteMerge)
import Grisette.Internal.Core.Data.Class.SEq (SEq ((.==)))
import Grisette.Internal.Core.Data.Class.SOrd (SOrd, mrgMax, mrgMin)
import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)
import Grisette.Internal.Core.Data.Class.Solvable (Solvable (con))
import Grisette.Internal.Core.Data.Class.TryMerge
( MonadTryMerge,
TryMerge,
tryMerge,
)
import Grisette.Internal.SymPrim.SymBool (SymBool)
import Grisette.Lib.Control.Applicative (mrgAsum, mrgPure, (.*>))
import {-# SOURCE #-} Grisette.Lib.Control.Monad
( mrgMplus,
mrgMzero,
mrgReturn,
(.>>),
)
import Grisette.Lib.Data.Functor (mrgFmap, mrgVoid)
symElem :: (Foldable t, SEq a) => a -> t a -> SymBool
symElem :: forall (t :: * -> *) a. (Foldable t, SEq a) => a -> t a -> SymBool
symElem a
x = (a -> SymBool) -> t a -> SymBool
forall (t :: * -> *) a.
Foldable t =>
(a -> SymBool) -> t a -> SymBool
symAny ((a -> a -> SymBool
forall a. SEq a => a -> a -> SymBool
.== a
x))
{-# INLINE symElem #-}
mrgMaximum ::
forall a t m.
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a ->
m a
mrgMaximum :: forall a (t :: * -> *) (m :: * -> *).
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a -> m a
mrgMaximum t a
l = do
Maybe a
r <- (Maybe a -> a -> m (Maybe a)) -> Maybe a -> t a -> m (Maybe a)
forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM Maybe a -> a -> m (Maybe a)
symMax' (Maybe a
forall a. Maybe a
Nothing :: Maybe a) t a
l
case Maybe a
r of
Maybe a
Nothing -> [Char] -> m a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"mrgMaximum: empty structure"
Just a
x -> a -> m a
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn a
x
where
symMax' :: Maybe a -> a -> m (Maybe a)
symMax' :: Maybe a -> a -> m (Maybe a)
symMax' Maybe a
mx a
y =
case Maybe a
mx of
Maybe a
Nothing -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
Just a
x -> (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
mrgFmap a -> Maybe a
forall a. a -> Maybe a
Just (m a -> m (Maybe a)) -> m a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> a -> m a
forall a (m :: * -> *).
(SOrd a, Mergeable a, UnionMergeable1 m, Applicative m) =>
a -> a -> m a
mrgMax a
x a
y
symMaximum ::
forall a t.
(Foldable t, Mergeable a, SOrd a, ITEOp a) =>
t a ->
a
symMaximum :: forall a (t :: * -> *).
(Foldable t, Mergeable a, SOrd a, ITEOp a) =>
t a -> a
symMaximum t a
l = UnionM a -> a
forall a (u :: * -> *).
(ITEOp a, Mergeable a, PlainUnion u) =>
u a -> a
symIteMerge (t a -> UnionM a
forall a (t :: * -> *) (m :: * -> *).
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a -> m a
mrgMaximum t a
l :: UnionM a)
{-# INLINE symMaximum #-}
mrgMinimum ::
forall a t m.
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a ->
m a
mrgMinimum :: forall a (t :: * -> *) (m :: * -> *).
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a -> m a
mrgMinimum t a
l = do
Maybe a
r <- (Maybe a -> a -> m (Maybe a)) -> Maybe a -> t a -> m (Maybe a)
forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM Maybe a -> a -> m (Maybe a)
symMin' (Maybe a
forall a. Maybe a
Nothing :: Maybe a) t a
l
case Maybe a
r of
Maybe a
Nothing -> [Char] -> m a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"mrgMinimum: empty structure"
Just a
x -> a -> m a
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn a
x
where
symMin' :: Maybe a -> a -> m (Maybe a)
symMin' :: Maybe a -> a -> m (Maybe a)
symMin' Maybe a
mx a
y =
case Maybe a
mx of
Maybe a
Nothing -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
Just a
x -> (a -> Maybe a) -> m a -> m (Maybe a)
forall (f :: * -> *) a b.
(TryMerge f, Mergeable a, Mergeable b, Functor f) =>
(a -> b) -> f a -> f b
mrgFmap a -> Maybe a
forall a. a -> Maybe a
Just (m a -> m (Maybe a)) -> m a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> a -> m a
forall a (m :: * -> *).
(SOrd a, Mergeable a, UnionMergeable1 m, Applicative m) =>
a -> a -> m a
mrgMin a
x a
y
symMinimum ::
forall a t.
(Foldable t, Mergeable a, SOrd a, ITEOp a) =>
t a ->
a
symMinimum :: forall a (t :: * -> *).
(Foldable t, Mergeable a, SOrd a, ITEOp a) =>
t a -> a
symMinimum t a
l = UnionM a -> a
forall a (u :: * -> *).
(ITEOp a, Mergeable a, PlainUnion u) =>
u a -> a
symIteMerge (t a -> UnionM a
forall a (t :: * -> *) (m :: * -> *).
(Foldable t, MonadUnion m, Mergeable a, SOrd a) =>
t a -> m a
mrgMinimum t a
l :: UnionM a)
{-# INLINE symMinimum #-}
mrgFoldrM ::
(MonadTryMerge m, Mergeable b, Foldable t) =>
(a -> b -> m b) ->
b ->
t a ->
m b
mrgFoldrM :: forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(a -> b -> m b) -> b -> t a -> m b
mrgFoldrM a -> b -> m b
f b
z0 t a
xs = ((b -> m b) -> a -> b -> m b) -> (b -> m b) -> t a -> b -> m b
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (b -> m b) -> a -> b -> m b
forall {b}. (b -> m b) -> a -> b -> m b
c b -> m b
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure t a
xs b
z0
where
c :: (b -> m b) -> a -> b -> m b
c b -> m b
k a
x b
z = m b -> m b
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (a -> b -> m b
f a
x b
z) m b -> (b -> m b) -> m b
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> m b
k
{-# INLINE mrgFoldrM #-}
mrgFoldlM ::
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) ->
b ->
t a ->
m b
mrgFoldlM :: forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM b -> a -> m b
f b
z0 t a
xs = (a -> (b -> m b) -> b -> m b) -> (b -> m b) -> t a -> b -> m b
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> (b -> m b) -> b -> m b
forall {b}. a -> (b -> m b) -> b -> m b
c b -> m b
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure t a
xs b
z0
where
c :: a -> (b -> m b) -> b -> m b
c a
x b -> m b
k b
z = m b -> m b
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (b -> a -> m b
f b
z a
x) m b -> (b -> m b) -> m b
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= b -> m b
k
{-# INLINE mrgFoldlM #-}
mrgTraverse_ ::
(Applicative m, TryMerge m, Foldable t) => (a -> m b) -> t a -> m ()
mrgTraverse_ :: forall (m :: * -> *) (t :: * -> *) a b.
(Applicative m, TryMerge m, Foldable t) =>
(a -> m b) -> t a -> m ()
mrgTraverse_ a -> m b
f = (a -> m () -> m ()) -> m () -> t a -> m ()
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> m () -> m ()
forall {b}. Mergeable b => a -> m b -> m b
c (() -> m ()
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure ())
where
c :: a -> m b -> m b
c a
x m b
k = m b -> m ()
forall (f :: * -> *) a. (TryMerge f, Functor f) => f a -> f ()
mrgVoid (a -> m b
f a
x) m () -> m b -> m b
forall (f :: * -> *) a b.
(Applicative f, TryMerge f, Mergeable a, Mergeable b) =>
f a -> f b -> f b
.*> m b
k
{-# INLINE mrgTraverse_ #-}
mrgFor_ ::
(Applicative m, TryMerge m, Foldable t) => t a -> (a -> m b) -> m ()
mrgFor_ :: forall (m :: * -> *) (t :: * -> *) a b.
(Applicative m, TryMerge m, Foldable t) =>
t a -> (a -> m b) -> m ()
mrgFor_ = ((a -> m b) -> t a -> m ()) -> t a -> (a -> m b) -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> m b) -> t a -> m ()
forall (m :: * -> *) (t :: * -> *) a b.
(Applicative m, TryMerge m, Foldable t) =>
(a -> m b) -> t a -> m ()
mrgTraverse_
{-# INLINE mrgFor_ #-}
mrgSequenceA_ ::
(Foldable t, TryMerge m, Applicative m) => t (m a) -> m ()
mrgSequenceA_ :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, TryMerge m, Applicative m) =>
t (m a) -> m ()
mrgSequenceA_ = (m a -> m () -> m ()) -> m () -> t (m a) -> m ()
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr m a -> m () -> m ()
forall {f :: * -> *} {b} {a}.
(Applicative f, Mergeable b, TryMerge f) =>
f a -> f b -> f b
c (() -> m ()
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure ())
where
c :: f a -> f b -> f b
c f a
m f b
k = f a -> f ()
forall (f :: * -> *) a. (TryMerge f, Functor f) => f a -> f ()
mrgVoid f a
m f () -> f b -> f b
forall (f :: * -> *) a b.
(Applicative f, TryMerge f, Mergeable a, Mergeable b) =>
f a -> f b -> f b
.*> f b
k
{-# INLINE mrgSequenceA_ #-}
mrgMapM_ :: (MonadTryMerge m, Foldable t) => (a -> m b) -> t a -> m ()
mrgMapM_ :: forall (m :: * -> *) (t :: * -> *) a b.
(MonadTryMerge m, Foldable t) =>
(a -> m b) -> t a -> m ()
mrgMapM_ = (a -> m b) -> t a -> m ()
forall (m :: * -> *) (t :: * -> *) a b.
(Applicative m, TryMerge m, Foldable t) =>
(a -> m b) -> t a -> m ()
mrgTraverse_
{-# INLINE mrgMapM_ #-}
mrgForM_ :: (MonadTryMerge m, Foldable t) => t a -> (a -> m b) -> m ()
mrgForM_ :: forall (m :: * -> *) (t :: * -> *) a b.
(MonadTryMerge m, Foldable t) =>
t a -> (a -> m b) -> m ()
mrgForM_ = ((a -> m b) -> t a -> m ()) -> t a -> (a -> m b) -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a -> m b) -> t a -> m ()
forall (m :: * -> *) (t :: * -> *) a b.
(MonadTryMerge m, Foldable t) =>
(a -> m b) -> t a -> m ()
mrgMapM_
{-# INLINE mrgForM_ #-}
mrgSequence_ :: (Foldable t, MonadTryMerge m) => t (m a) -> m ()
mrgSequence_ :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadTryMerge m) =>
t (m a) -> m ()
mrgSequence_ = (m a -> m () -> m ()) -> m () -> t (m a) -> m ()
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr m a -> m () -> m ()
forall {m :: * -> *} {b} {a}.
(Monad m, Mergeable b, TryMerge m) =>
m a -> m b -> m b
c (() -> m ()
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure ())
where
c :: m a -> m b -> m b
c m a
m m b
k = m a -> m ()
forall (f :: * -> *) a. (TryMerge f, Functor f) => f a -> f ()
mrgVoid m a
m m () -> m b -> m b
forall (m :: * -> *) a b.
(MonadTryMerge m, Mergeable a, Mergeable b) =>
m a -> m b -> m b
.>> m b
k
{-# INLINE mrgSequence_ #-}
mrgMsum ::
(MonadTryMerge m, Mergeable a, MonadPlus m, Foldable t) => t (m a) -> m a
mrgMsum :: forall (m :: * -> *) a (t :: * -> *).
(MonadTryMerge m, Mergeable a, MonadPlus m, Foldable t) =>
t (m a) -> m a
mrgMsum = (m a -> m a -> m a) -> m a -> t (m a) -> m a
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr m a -> m a -> m a
forall (m :: * -> *) a.
(MonadTryMerge m, Mergeable a, MonadPlus m) =>
m a -> m a -> m a
mrgMplus m a
forall (m :: * -> *) a.
(MonadTryMerge m, Mergeable a, MonadPlus m) =>
m a
mrgMzero
{-# INLINE mrgMsum #-}
symAnd :: (Foldable t) => t SymBool -> SymBool
symAnd :: forall (t :: * -> *). Foldable t => t SymBool -> SymBool
symAnd = (SymBool -> SymBool -> SymBool) -> SymBool -> t SymBool -> SymBool
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' SymBool -> SymBool -> SymBool
forall b. LogicalOp b => b -> b -> b
(.&&) (Bool -> SymBool
forall c t. Solvable c t => c -> t
con Bool
True)
symOr :: (Foldable t) => t SymBool -> SymBool
symOr :: forall (t :: * -> *). Foldable t => t SymBool -> SymBool
symOr = (SymBool -> SymBool -> SymBool) -> SymBool -> t SymBool -> SymBool
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' SymBool -> SymBool -> SymBool
forall b. LogicalOp b => b -> b -> b
(.||) (Bool -> SymBool
forall c t. Solvable c t => c -> t
con Bool
False)
symAny :: (Foldable t) => (a -> SymBool) -> t a -> SymBool
symAny :: forall (t :: * -> *) a.
Foldable t =>
(a -> SymBool) -> t a -> SymBool
symAny a -> SymBool
f = (SymBool -> a -> SymBool) -> SymBool -> t a -> SymBool
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\SymBool
acc a
v -> SymBool
acc SymBool -> SymBool -> SymBool
forall b. LogicalOp b => b -> b -> b
.|| a -> SymBool
f a
v) (Bool -> SymBool
forall c t. Solvable c t => c -> t
con Bool
False)
symAll :: (Foldable t) => (a -> SymBool) -> t a -> SymBool
symAll :: forall (t :: * -> *) a.
Foldable t =>
(a -> SymBool) -> t a -> SymBool
symAll a -> SymBool
f = (SymBool -> a -> SymBool) -> SymBool -> t a -> SymBool
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\SymBool
acc a
v -> SymBool
acc SymBool -> SymBool -> SymBool
forall b. LogicalOp b => b -> b -> b
.&& a -> SymBool
f a
v) (Bool -> SymBool
forall c t. Solvable c t => c -> t
con Bool
True)
mrgMaximumBy ::
forall t a m.
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) ->
t a ->
m a
mrgMaximumBy :: forall (t :: * -> *) a (m :: * -> *).
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) -> t a -> m a
mrgMaximumBy a -> a -> UnionM Ordering
cmp t a
l = do
Maybe a
r <- (Maybe a -> a -> m (Maybe a)) -> Maybe a -> t a -> m (Maybe a)
forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM Maybe a -> a -> m (Maybe a)
symMax' (Maybe a
forall a. Maybe a
Nothing :: Maybe a) t a
l
case Maybe a
r of
Maybe a
Nothing -> [Char] -> m a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"mrgMaximumBy: empty structure"
Just a
x -> a -> m a
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn a
x
where
symMax' :: Maybe a -> a -> m (Maybe a)
symMax' :: Maybe a -> a -> m (Maybe a)
symMax' Maybe a
mx a
y =
case Maybe a
mx of
Maybe a
Nothing -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
Just a
x -> do
Ordering
cmpRes <- UnionM Ordering -> m Ordering
forall a (u :: * -> *).
(Mergeable a, UnionMergeable1 u, Applicative u) =>
UnionM a -> u a
liftUnionM (UnionM Ordering -> m Ordering) -> UnionM Ordering -> m Ordering
forall a b. (a -> b) -> a -> b
$ a -> a -> UnionM Ordering
cmp a
x a
y
case Ordering
cmpRes of
Ordering
GT -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
x
Ordering
_ -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
symMaximumBy ::
forall t a.
(Foldable t, Mergeable a, ITEOp a) =>
(a -> a -> UnionM Ordering) ->
t a ->
a
symMaximumBy :: forall (t :: * -> *) a.
(Foldable t, Mergeable a, ITEOp a) =>
(a -> a -> UnionM Ordering) -> t a -> a
symMaximumBy a -> a -> UnionM Ordering
cmp t a
l = UnionM a -> a
forall a (u :: * -> *).
(ITEOp a, Mergeable a, PlainUnion u) =>
u a -> a
symIteMerge ((a -> a -> UnionM Ordering) -> t a -> UnionM a
forall (t :: * -> *) a (m :: * -> *).
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) -> t a -> m a
mrgMaximumBy a -> a -> UnionM Ordering
cmp t a
l :: UnionM a)
{-# INLINE symMaximumBy #-}
mrgMinimumBy ::
forall t a m.
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) ->
t a ->
m a
mrgMinimumBy :: forall (t :: * -> *) a (m :: * -> *).
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) -> t a -> m a
mrgMinimumBy a -> a -> UnionM Ordering
cmp t a
l = do
Maybe a
r <- (Maybe a -> a -> m (Maybe a)) -> Maybe a -> t a -> m (Maybe a)
forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM Maybe a -> a -> m (Maybe a)
symMin' (Maybe a
forall a. Maybe a
Nothing :: Maybe a) t a
l
case Maybe a
r of
Maybe a
Nothing -> [Char] -> m a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"mrgMinimumBy: empty structure"
Just a
x -> a -> m a
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn a
x
where
symMin' :: Maybe a -> a -> m (Maybe a)
symMin' :: Maybe a -> a -> m (Maybe a)
symMin' Maybe a
mx a
y =
case Maybe a
mx of
Maybe a
Nothing -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
Just a
x -> do
Ordering
cmpRes <- UnionM Ordering -> m Ordering
forall a (u :: * -> *).
(Mergeable a, UnionMergeable1 u, Applicative u) =>
UnionM a -> u a
liftUnionM (UnionM Ordering -> m Ordering) -> UnionM Ordering -> m Ordering
forall a b. (a -> b) -> a -> b
$ a -> a -> UnionM Ordering
cmp a
x a
y
case Ordering
cmpRes of
Ordering
GT -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
y
Ordering
_ -> Maybe a -> m (Maybe a)
forall (u :: * -> *) a. (MonadTryMerge u, Mergeable a) => a -> u a
mrgReturn (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
x
symMinimumBy ::
forall t a.
(Foldable t, Mergeable a, ITEOp a) =>
(a -> a -> UnionM Ordering) ->
t a ->
a
symMinimumBy :: forall (t :: * -> *) a.
(Foldable t, Mergeable a, ITEOp a) =>
(a -> a -> UnionM Ordering) -> t a -> a
symMinimumBy a -> a -> UnionM Ordering
cmp t a
l = UnionM a -> a
forall a (u :: * -> *).
(ITEOp a, Mergeable a, PlainUnion u) =>
u a -> a
symIteMerge ((a -> a -> UnionM Ordering) -> t a -> UnionM a
forall (t :: * -> *) a (m :: * -> *).
(Foldable t, Mergeable a, MonadUnion m) =>
(a -> a -> UnionM Ordering) -> t a -> m a
mrgMinimumBy a -> a -> UnionM Ordering
cmp t a
l :: UnionM a)
{-# INLINE symMinimumBy #-}
symNotElem :: (Foldable t, SEq a) => a -> t a -> SymBool
symNotElem :: forall (t :: * -> *) a. (Foldable t, SEq a) => a -> t a -> SymBool
symNotElem a
x = SymBool -> SymBool
forall b. LogicalOp b => b -> b
symNot (SymBool -> SymBool) -> (t a -> SymBool) -> t a -> SymBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> t a -> SymBool
forall (t :: * -> *) a. (Foldable t, SEq a) => a -> t a -> SymBool
symElem a
x
{-# INLINE symNotElem #-}
mrgFind ::
(Foldable t, MonadUnion m, Mergeable a) =>
(a -> SymBool) ->
t a ->
m (Maybe a)
mrgFind :: forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadUnion m, Mergeable a) =>
(a -> SymBool) -> t a -> m (Maybe a)
mrgFind a -> SymBool
f = (Maybe a -> a -> m (Maybe a)) -> Maybe a -> t a -> m (Maybe a)
forall (m :: * -> *) b (t :: * -> *) a.
(MonadTryMerge m, Mergeable b, Foldable t) =>
(b -> a -> m b) -> b -> t a -> m b
mrgFoldlM Maybe a -> a -> m (Maybe a)
forall {m :: * -> *}.
(Applicative m, UnionMergeable1 m) =>
Maybe a -> a -> m (Maybe a)
fst (Maybe a
forall a. Maybe a
Nothing :: Maybe a)
where
fst :: Maybe a -> a -> m (Maybe a)
fst Maybe a
acc a
v = do
case Maybe a
acc of
Just a
_ -> Maybe a -> m (Maybe a)
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure Maybe a
acc
Maybe a
Nothing -> do
SymBool -> m (Maybe a) -> m (Maybe a) -> m (Maybe a)
forall (u :: * -> *) a.
(UnionMergeable1 u, Mergeable a) =>
SymBool -> u a -> u a -> u a
mrgIf (a -> SymBool
f a
v) (Maybe a -> m (Maybe a)
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure (Maybe a -> m (Maybe a)) -> Maybe a -> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
v) (Maybe a -> m (Maybe a)
forall (m :: * -> *) a.
(TryMerge m, Applicative m, Mergeable a) =>
a -> m a
mrgPure Maybe a
forall a. Maybe a
Nothing)