{-# LANGUAGE OverloadedStrings #-}
module Test.Hspec.TidyFormatter.Internal.Parts
where
import Control.Monad (when)
import Data.String (IsString (..))
import Data.Monoid (Endo (..))
import Data.Bifunctor (Bifunctor (..))
newtype Parts ann b = Parts [(ann,b)]
deriving ((forall a b. (a -> b) -> Parts ann a -> Parts ann b)
-> (forall a b. a -> Parts ann b -> Parts ann a)
-> Functor (Parts ann)
forall a b. a -> Parts ann b -> Parts ann a
forall a b. (a -> b) -> Parts ann a -> Parts ann b
forall ann a b. a -> Parts ann b -> Parts ann a
forall ann a b. (a -> b) -> Parts ann a -> Parts ann b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall ann a b. (a -> b) -> Parts ann a -> Parts ann b
fmap :: forall a b. (a -> b) -> Parts ann a -> Parts ann b
$c<$ :: forall ann a b. a -> Parts ann b -> Parts ann a
<$ :: forall a b. a -> Parts ann b -> Parts ann a
Functor, ReadPrec [Parts ann b]
ReadPrec (Parts ann b)
Int -> ReadS (Parts ann b)
ReadS [Parts ann b]
(Int -> ReadS (Parts ann b))
-> ReadS [Parts ann b]
-> ReadPrec (Parts ann b)
-> ReadPrec [Parts ann b]
-> Read (Parts ann b)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall ann b. (Read ann, Read b) => ReadPrec [Parts ann b]
forall ann b. (Read ann, Read b) => ReadPrec (Parts ann b)
forall ann b. (Read ann, Read b) => Int -> ReadS (Parts ann b)
forall ann b. (Read ann, Read b) => ReadS [Parts ann b]
$creadsPrec :: forall ann b. (Read ann, Read b) => Int -> ReadS (Parts ann b)
readsPrec :: Int -> ReadS (Parts ann b)
$creadList :: forall ann b. (Read ann, Read b) => ReadS [Parts ann b]
readList :: ReadS [Parts ann b]
$creadPrec :: forall ann b. (Read ann, Read b) => ReadPrec (Parts ann b)
readPrec :: ReadPrec (Parts ann b)
$creadListPrec :: forall ann b. (Read ann, Read b) => ReadPrec [Parts ann b]
readListPrec :: ReadPrec [Parts ann b]
Read, Int -> Parts ann b -> ShowS
[Parts ann b] -> ShowS
Parts ann b -> String
(Int -> Parts ann b -> ShowS)
-> (Parts ann b -> String)
-> ([Parts ann b] -> ShowS)
-> Show (Parts ann b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall ann b. (Show ann, Show b) => Int -> Parts ann b -> ShowS
forall ann b. (Show ann, Show b) => [Parts ann b] -> ShowS
forall ann b. (Show ann, Show b) => Parts ann b -> String
$cshowsPrec :: forall ann b. (Show ann, Show b) => Int -> Parts ann b -> ShowS
showsPrec :: Int -> Parts ann b -> ShowS
$cshow :: forall ann b. (Show ann, Show b) => Parts ann b -> String
show :: Parts ann b -> String
$cshowList :: forall ann b. (Show ann, Show b) => [Parts ann b] -> ShowS
showList :: [Parts ann b] -> ShowS
Show, Parts ann b -> Parts ann b -> Bool
(Parts ann b -> Parts ann b -> Bool)
-> (Parts ann b -> Parts ann b -> Bool) -> Eq (Parts ann b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ann b. (Eq ann, Eq b) => Parts ann b -> Parts ann b -> Bool
$c== :: forall ann b. (Eq ann, Eq b) => Parts ann b -> Parts ann b -> Bool
== :: Parts ann b -> Parts ann b -> Bool
$c/= :: forall ann b. (Eq ann, Eq b) => Parts ann b -> Parts ann b -> Bool
/= :: Parts ann b -> Parts ann b -> Bool
Eq, Eq (Parts ann b)
Eq (Parts ann b) =>
(Parts ann b -> Parts ann b -> Ordering)
-> (Parts ann b -> Parts ann b -> Bool)
-> (Parts ann b -> Parts ann b -> Bool)
-> (Parts ann b -> Parts ann b -> Bool)
-> (Parts ann b -> Parts ann b -> Bool)
-> (Parts ann b -> Parts ann b -> Parts ann b)
-> (Parts ann b -> Parts ann b -> Parts ann b)
-> Ord (Parts ann b)
Parts ann b -> Parts ann b -> Bool
Parts ann b -> Parts ann b -> Ordering
Parts ann b -> Parts ann b -> Parts ann b
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ann b. (Ord ann, Ord b) => Eq (Parts ann b)
forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Bool
forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Ordering
forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Parts ann b
$ccompare :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Ordering
compare :: Parts ann b -> Parts ann b -> Ordering
$c< :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Bool
< :: Parts ann b -> Parts ann b -> Bool
$c<= :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Bool
<= :: Parts ann b -> Parts ann b -> Bool
$c> :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Bool
> :: Parts ann b -> Parts ann b -> Bool
$c>= :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Bool
>= :: Parts ann b -> Parts ann b -> Bool
$cmax :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Parts ann b
max :: Parts ann b -> Parts ann b -> Parts ann b
$cmin :: forall ann b.
(Ord ann, Ord b) =>
Parts ann b -> Parts ann b -> Parts ann b
min :: Parts ann b -> Parts ann b -> Parts ann b
Ord)
instance Bifunctor Parts where
bimap :: (ann -> ann') -> (b -> b') -> Parts ann b -> Parts ann' b'
bimap :: forall a b c d. (a -> b) -> (c -> d) -> Parts a c -> Parts b d
bimap ann -> ann'
f b -> b'
g = (ann -> ann') -> Parts ann b' -> Parts ann' b'
forall a b c. (a -> b) -> Parts a c -> Parts b c
mapAnn ann -> ann'
f (Parts ann b' -> Parts ann' b')
-> (Parts ann b -> Parts ann b') -> Parts ann b -> Parts ann' b'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> b') -> Parts ann b -> Parts ann b'
forall a b. (a -> b) -> Parts ann a -> Parts ann b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> b'
g
instance Semigroup (Parts ann b) where
Parts [(ann, b)]
xs <> :: Parts ann b -> Parts ann b -> Parts ann b
<> Parts [(ann, b)]
ys = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts ([(ann, b)]
xs [(ann, b)] -> [(ann, b)] -> [(ann, b)]
forall a. [a] -> [a] -> [a]
++ [(ann, b)]
ys)
instance Monoid (Parts ann b) where
mempty :: Parts ann b
mempty = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts []
instance (Monoid ann, IsString b) => IsString (Parts ann b) where
fromString :: String -> Parts ann b
fromString = String -> Parts ann b
forall ann b. (Monoid ann, IsString b) => String -> Parts ann b
string
singleton :: ann -> b -> Parts ann b
singleton :: forall ann b. ann -> b -> Parts ann b
singleton ann
ann b
x = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts [(ann
ann,b
x)]
value :: Monoid ann => b -> Parts ann b
value :: forall ann b. Monoid ann => b -> Parts ann b
value b
x = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts [(ann
forall a. Monoid a => a
mempty,b
x)]
string :: (Monoid ann, IsString b) => String -> Parts ann b
string :: forall ann b. (Monoid ann, IsString b) => String -> Parts ann b
string String
s = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts [(ann
forall a. Monoid a => a
mempty,String -> b
forall a. IsString a => String -> a
fromString String
s)]
empty :: Parts ann b
empty :: forall ann b. Parts ann b
empty = [(ann, b)] -> Parts ann b
forall ann b. [(ann, b)] -> Parts ann b
Parts []
maybeEmpty :: Maybe (Parts ann b) -> Parts ann b
maybeEmpty :: forall ann b. Maybe (Parts ann b) -> Parts ann b
maybeEmpty = \case
Just Parts ann b
p -> Parts ann b
p
Maybe (Parts ann b)
_ -> Parts ann b
forall ann b. Parts ann b
empty
mapAnn :: (ann->ann') -> Parts ann b -> Parts ann' b
mapAnn :: forall a b c. (a -> b) -> Parts a c -> Parts b c
mapAnn ann -> ann'
f (Parts [(ann, b)]
xs) = [(ann', b)] -> Parts ann' b
forall ann b. [(ann, b)] -> Parts ann b
Parts ((ann, b) -> (ann', b)
forall {b}. (ann, b) -> (ann', b)
f' ((ann, b) -> (ann', b)) -> [(ann, b)] -> [(ann', b)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(ann, b)]
xs)
where
f' :: (ann, b) -> (ann', b)
f' (ann
ann,b
b) = (ann -> ann'
f ann
ann,b
b)
with :: Parts ann b -> (ann -> ann') -> Parts ann' b
with :: forall ann b ann'. Parts ann b -> (ann -> ann') -> Parts ann' b
with = ((ann -> ann') -> Parts ann b -> Parts ann' b)
-> Parts ann b -> (ann -> ann') -> Parts ann' b
forall a b c. (a -> b -> c) -> b -> a -> c
flip (ann -> ann') -> Parts ann b -> Parts ann' b
forall a b c. (a -> b) -> Parts a c -> Parts b c
mapAnn
infixl 7 `with`
foldParts ::
((ann,b) -> acc -> acc)
-> acc
-> Parts ann b
-> acc
foldParts :: forall ann b acc.
((ann, b) -> acc -> acc) -> acc -> Parts ann b -> acc
foldParts (ann, b) -> acc -> acc
f acc
z (Parts [(ann, b)]
xs) = ((ann, b) -> acc -> acc) -> acc -> [(ann, b)] -> acc
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (ann, b) -> acc -> acc
f acc
z [(ann, b)]
xs
interpret :: ∀ ann b c acc.
(ann->b->c)
-> (c->acc->acc)
-> acc
-> Parts ann b
-> acc
interpret :: forall ann b c acc.
(ann -> b -> c) -> (c -> acc -> acc) -> acc -> Parts ann b -> acc
interpret ann -> b -> c
interp c -> acc -> acc
f = ((ann, b) -> acc -> acc) -> acc -> Parts ann b -> acc
forall ann b acc.
((ann, b) -> acc -> acc) -> acc -> Parts ann b -> acc
foldParts (ann, b) -> acc -> acc
f'
where
f' :: (ann,b) -> acc -> acc
f' :: (ann, b) -> acc -> acc
f' (ann
ann,b
b) acc
acc = ann -> b -> c
interp ann
ann b
b c -> acc -> acc
`f` acc
acc
type Silenceable m b = Parts (Endo (m ())) b
when' :: Monad m =>
m Bool
-> Silenceable m b
-> Silenceable m b
when' :: forall (m :: * -> *) b.
Monad m =>
m Bool -> Silenceable m b -> Silenceable m b
when' m Bool
bM = (Endo (m ()) -> Endo (m ()))
-> Parts (Endo (m ())) b -> Parts (Endo (m ())) b
forall a b c. (a -> b) -> Parts a c -> Parts b c
mapAnn ((m () -> m ()) -> Endo (m ())
forall a. (a -> a) -> Endo a
Endo m () -> m ()
f <>)
where
f :: m () -> m ()
f m ()
action = do
Bool
b <- m Bool
bM
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
b m ()
action
whenA :: Applicative f =>
Bool
-> Silenceable f b
-> Silenceable f b
whenA :: forall (f :: * -> *) b.
Applicative f =>
Bool -> Silenceable f b -> Silenceable f b
whenA Bool
b = (Endo (f ()) -> Endo (f ()))
-> Parts (Endo (f ())) b -> Parts (Endo (f ())) b
forall a b c. (a -> b) -> Parts a c -> Parts b c
mapAnn ((f () -> f ()) -> Endo (f ())
forall a. (a -> a) -> Endo a
Endo (Bool -> f () -> f ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
b) <>)
onlyIf :: Monad m =>
Silenceable m b
-> m Bool
-> Silenceable m b
onlyIf :: forall (m :: * -> *) b.
Monad m =>
Silenceable m b -> m Bool -> Silenceable m b
onlyIf = (m Bool -> Silenceable m b -> Silenceable m b)
-> Silenceable m b -> m Bool -> Silenceable m b
forall a b c. (a -> b -> c) -> b -> a -> c
flip m Bool -> Silenceable m b -> Silenceable m b
forall (m :: * -> *) b.
Monad m =>
m Bool -> Silenceable m b -> Silenceable m b
when'
infixl 7 `onlyIf`
ifThenElse :: Monad m =>
m Bool
-> Silenceable m b
-> Silenceable m b
-> Silenceable m b
ifThenElse :: forall (m :: * -> *) b.
Monad m =>
m Bool -> Silenceable m b -> Silenceable m b -> Silenceable m b
ifThenElse m Bool
pM Silenceable m b
true Silenceable m b
false =
(m Bool -> Silenceable m b -> Silenceable m b
forall (m :: * -> *) b.
Monad m =>
m Bool -> Silenceable m b -> Silenceable m b
when' m Bool
pM Silenceable m b
true )
Silenceable m b -> Silenceable m b -> Silenceable m b
forall a. Semigroup a => a -> a -> a
<> (m Bool -> Silenceable m b -> Silenceable m b
forall (m :: * -> *) b.
Monad m =>
m Bool -> Silenceable m b -> Silenceable m b
when' (Bool -> Bool
not(Bool -> Bool) -> m Bool -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>m Bool
pM) Silenceable m b
false)
run :: Monad m =>
(b -> m ())
-> Silenceable m b
-> m ()
run :: forall (m :: * -> *) b.
Monad m =>
(b -> m ()) -> Silenceable m b -> m ()
run b -> m ()
emit = (Endo (m ()) -> b -> m ())
-> (m () -> m () -> m ()) -> m () -> Parts (Endo (m ())) b -> m ()
forall ann b c acc.
(ann -> b -> c) -> (c -> acc -> acc) -> acc -> Parts ann b -> acc
interpret Endo (m ()) -> b -> m ()
f m () -> m () -> m ()
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
(>>) m ()
z
where
f :: Endo (m ()) -> b -> m ()
f Endo (m ())
ann b
b = Endo (m ()) -> m () -> m ()
forall a. Endo a -> a -> a
appEndo Endo (m ())
ann (b -> m ()
emit b
b)
z :: m ()
z = () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()