{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TypeApplications #-}
module Control.Concurrent.Counter.Lifted.IO
( Counter
, new
, get
, set
, cas
, add
, sub
, and
, or
, xor
, nand
) where
import Prelude hiding (and, or)
import Data.Coerce
import GHC.Exts (RealWorld)
import GHC.IO
import GHC.ST
import Control.Concurrent.Counter.Lifted.ST qualified as Lifted
newtype Counter = Counter (Lifted.Counter RealWorld)
instance Eq Counter where
== :: Counter -> Counter -> Bool
(==) = coerce :: forall a b. Coercible a b => a -> b
coerce (forall a. Eq a => a -> a -> Bool
(==) @(Lifted.Counter RealWorld))
{-# INLINE new #-}
new :: Int -> IO Counter
new :: Int -> IO Counter
new = coerce :: forall a b. Coercible a b => a -> b
coerce forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ST RealWorld a -> IO a
stToIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s. Int -> ST s (Counter s)
Lifted.new
{-# INLINE get #-}
get :: Counter -> IO Int
get :: Counter -> IO Int
get = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> ST s Int
Lifted.get
{-# INLINE set #-}
set :: Counter -> Int -> IO ()
set :: Counter -> Int -> IO ()
set = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s ()
Lifted.set
{-# INLINE cas #-}
cas
:: Counter
-> Int
-> Int
-> IO Int
cas :: Counter -> Int -> Int -> IO Int
cas = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> Int -> ST s Int
Lifted.cas
{-# INLINE add #-}
add :: Counter -> Int -> IO Int
add :: Counter -> Int -> IO Int
add = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.add
{-# INLINE sub #-}
sub :: Counter -> Int -> IO Int
sub :: Counter -> Int -> IO Int
sub = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.sub
{-# INLINE and #-}
and :: Counter -> Int -> IO Int
and :: Counter -> Int -> IO Int
and = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.and
{-# INLINE or #-}
or :: Counter -> Int -> IO Int
or :: Counter -> Int -> IO Int
or = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.or
{-# INLINE xor #-}
xor :: Counter -> Int -> IO Int
xor :: Counter -> Int -> IO Int
xor = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.xor
{-# INLINE nand #-}
nand :: Counter -> Int -> IO Int
nand :: Counter -> Int -> IO Int
nand = coerce :: forall a b. Coercible a b => a -> b
coerce forall s. Counter s -> Int -> ST s Int
Lifted.nand