{-# LANGUAGE NoImplicitPrelude, UnicodeSyntax #-}
module Utils where
--------------------------------------------------------------------------------
-- Imports
--------------------------------------------------------------------------------
-- from base:
import Control.Exception ( SomeException(SomeException), throwIO )
import Control.Monad ( Monad, return, (>>=), (>>), fail )
import Data.Bool ( Bool(..) )
import Data.Eq ( Eq )
import Data.Function ( flip, id )
import Data.Functor ( Functor, (<$>), (<$) )
import Data.Maybe ( Maybe(Nothing, Just), maybe )
import Prelude ( ($!) )
import System.IO ( IO )
-- from base-unicode-symbols:
import Data.Eq.Unicode ( (≡) )
import Data.Function.Unicode ( (∘) )
-- from stm:
import Control.Concurrent.STM ( STM )
import Control.Concurrent.STM.TMVar ( TMVar, tryTakeTMVar, putTMVar )
import Control.Concurrent.STM.TVar ( TVar, readTVar, writeTVar )
--------------------------------------------------------------------------------
-- Utility functions
--------------------------------------------------------------------------------
-- | Check if the given value equals 'Just' 'True'.
isJustTrue ∷ Maybe Bool → Bool
isJustTrue = maybe False id
-- | Check if the given value in the 'Maybe' equals the given reference value.
justEq ∷ Eq α ⇒ α → Maybe α → Bool
justEq = maybe False ∘ (≡)
-- | A flipped '<$>'.
(<$$>) ∷ Functor f ⇒ f α → (α → β) → f β
(<$$>) = flip (<$>)
-- | Ignore the value.
void ∷ Functor f ⇒ f α → f ()
void = (() <$)
-- | Monadic @if then else@
ifM ∷ Monad m ⇒ m Bool → m α → m α → m α
ifM c t e = c >>= \b → if b then t else e
-- | Throw the exception stored inside the 'SomeException'.
throwInner ∷ SomeException → IO α
throwInner (SomeException e) = throwIO e
-- | Non retrying 'takeMVar'.
tryReadTMVar ∷ TMVar α → STM (Maybe α)
tryReadTMVar mv = do mx ← tryTakeTMVar mv
case mx of
Nothing → return mx
Just x → putTMVar mv x >> return mx
-- | Strictly modify the contents of a 'TVar'.
modifyTVar ∷ TVar α → (α → α) → STM ()
modifyTVar tv f = readTVar tv >>= writeTVar tv ∘! f
-- | Strict function composition
(∘!) ∷ (β → γ) → (α → β) → (α → γ)
f ∘! g = \x → f $! g x
-- The End ---------------------------------------------------------------------