{-# LANGUAGE PatternSynonyms #-}
module GHC.Utils.EndoOS( EndoOS(EndoOS, runEndoOS ) ) where
import GHC.Prelude
import Data.Semigroup
import GHC.Exts (oneShot)
newtype EndoOS a = EndoOS' { forall a. EndoOS a -> a -> a
runEndoOS :: a -> a }
instance Semigroup (EndoOS a) where
EndoOS' a -> a
f <> :: EndoOS a -> EndoOS a -> EndoOS a
<> EndoOS' a -> a
g = (a -> a) -> EndoOS a
forall a. (a -> a) -> EndoOS a
EndoOS (\a
x -> a -> a
g (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$! a -> a
f a
x)
instance Monoid (EndoOS a) where
mempty :: EndoOS a
mempty = (a -> a) -> EndoOS a
forall a. (a -> a) -> EndoOS a
EndoOS a -> a
forall a. a -> a
id
pattern EndoOS :: (a->a) -> EndoOS a
{-# COMPLETE EndoOS #-}
pattern $mEndoOS :: forall {r} {a}. EndoOS a -> ((a -> a) -> r) -> ((# #) -> r) -> r
$bEndoOS :: forall a. (a -> a) -> EndoOS a
EndoOS f <- EndoOS' f
where
EndoOS a -> a
f = (a -> a) -> EndoOS a
forall a. (a -> a) -> EndoOS a
EndoOS' ((a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
oneShot a -> a
f)