{-# language MagicHash #-}
{-# language UnboxedTuples #-}
{-# language UnboxedSums #-}
{-# language DataKinds #-}
{-# language PolyKinds #-}
{-# language RoleAnnotations #-}
{-# language ScopedTypeVariables #-}
{-# language TypeFamilies #-}
{-# language UnliftedNewtypes #-}
module Data.Primitive.Unlifted.Weak.Primops
( UnliftedWeak#
, mkWeakFromUnliftedToUnlifted#
, mkWeakFromUnliftedToUnliftedNoFinalizer#
, mkWeakToUnlifted#
, mkWeakToUnliftedNoFinalizer#
, addCFinalizerToUnliftedWeak1#
, addCFinalizerToUnliftedWeak2#
, deRefUnliftedWeak#
, finalizeUnliftedWeak#
) where
import Data.Coerce (coerce)
import GHC.Exts
( RealWorld, State#
, Weak#, mkWeak#, mkWeakNoFinalizer#, deRefWeak#, finalizeWeak#, Addr#
, Int#, nullAddr#, addCFinalizerToWeak#)
import Data.Primitive.Unlifted.Type
newtype UnliftedWeak# (a :: UnliftedType) = UnliftedWeak# (Weak# a)
type role UnliftedWeak# representational
mkWeakFromUnliftedToUnlifted#
:: forall (k :: UnliftedType) (v :: UnliftedType) c.
k -> v -> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# INLINE mkWeakFromUnliftedToUnlifted# #-}
mkWeakFromUnliftedToUnlifted# :: forall (k :: UnliftedType) (v :: UnliftedType) c.
k
-> v
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, UnliftedWeak# v #)
mkWeakFromUnliftedToUnlifted# k
k v
v State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s = (# State# RealWorld, Weak# v #)
-> (# State# RealWorld, UnliftedWeak# v #)
forall a b. Coercible a b => a -> b
coerce (k
-> v
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# v #)
forall a b c.
a
-> b
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# b #)
mkWeak# k
k v
v State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s)
mkWeakFromUnliftedToUnliftedNoFinalizer#
:: forall (k :: UnliftedType) (v :: UnliftedType).
k -> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# INLINE mkWeakFromUnliftedToUnliftedNoFinalizer# #-}
mkWeakFromUnliftedToUnliftedNoFinalizer# :: forall (k :: UnliftedType) (v :: UnliftedType).
k
-> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
mkWeakFromUnliftedToUnliftedNoFinalizer# k
k v
v State# RealWorld
s = (# State# RealWorld, Weak# v #)
-> (# State# RealWorld, UnliftedWeak# v #)
forall a b. Coercible a b => a -> b
coerce (k -> v -> State# RealWorld -> (# State# RealWorld, Weak# v #)
forall a b.
a -> b -> State# RealWorld -> (# State# RealWorld, Weak# b #)
mkWeakNoFinalizer# k
k v
v State# RealWorld
s)
mkWeakToUnlifted#
:: forall k (v :: UnliftedType) c.
k -> v -> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# INLINE mkWeakToUnlifted# #-}
mkWeakToUnlifted# :: forall k (v :: UnliftedType) c.
k
-> v
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, UnliftedWeak# v #)
mkWeakToUnlifted# k
k v
v State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s = (# State# RealWorld, Weak# v #)
-> (# State# RealWorld, UnliftedWeak# v #)
forall a b. Coercible a b => a -> b
coerce (k
-> v
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# v #)
forall a b c.
a
-> b
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# b #)
mkWeak# k
k v
v State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s)
mkWeakToUnliftedNoFinalizer#
:: forall k (v :: UnliftedType).
k -> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# INLINE mkWeakToUnliftedNoFinalizer# #-}
mkWeakToUnliftedNoFinalizer# :: forall k (v :: UnliftedType).
k
-> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
mkWeakToUnliftedNoFinalizer# k
k v
v State# RealWorld
s = (# State# RealWorld, Weak# v #)
-> (# State# RealWorld, UnliftedWeak# v #)
forall a b. Coercible a b => a -> b
coerce (k -> v -> State# RealWorld -> (# State# RealWorld, Weak# v #)
forall a b.
a -> b -> State# RealWorld -> (# State# RealWorld, Weak# b #)
mkWeakNoFinalizer# k
k v
v State# RealWorld
s)
addCFinalizerToUnliftedWeak1# :: Addr# -> Addr# -> UnliftedWeak# b -> State# RealWorld -> (# State# RealWorld, Int# #)
{-# INLINE addCFinalizerToUnliftedWeak1# #-}
addCFinalizerToUnliftedWeak1# :: forall (b :: UnliftedType).
Addr#
-> Addr#
-> UnliftedWeak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToUnliftedWeak1# Addr#
fptr Addr#
ptr (UnliftedWeak# Weak# b
w)
= Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
forall b.
Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToWeak# Addr#
fptr Addr#
ptr Int#
0# Addr#
nullAddr# Weak# b
w
addCFinalizerToUnliftedWeak2# :: Addr# -> Addr# -> Addr# -> UnliftedWeak# b -> State# RealWorld -> (# State# RealWorld, Int# #)
{-# INLINE addCFinalizerToUnliftedWeak2# #-}
addCFinalizerToUnliftedWeak2# :: forall (b :: UnliftedType).
Addr#
-> Addr#
-> Addr#
-> UnliftedWeak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToUnliftedWeak2# Addr#
fptr Addr#
eptr Addr#
ptr (UnliftedWeak# Weak# b
w)
= Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
forall b.
Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToWeak# Addr#
fptr Addr#
ptr Int#
1# Addr#
eptr Weak# b
w
deRefUnliftedWeak#
:: UnliftedWeak# v
-> State# RealWorld
-> (# State# RealWorld, (# (##) | v #) #)
{-# INLINE deRefUnliftedWeak# #-}
deRefUnliftedWeak# :: forall (v :: UnliftedType).
UnliftedWeak# v
-> State# RealWorld -> (# State# RealWorld, (# (# #) | v #) #)
deRefUnliftedWeak# (UnliftedWeak# Weak# v
w) State# RealWorld
s =
case Weak# v -> State# RealWorld -> (# State# RealWorld, Int#, v #)
forall a.
Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, a #)
deRefWeak# Weak# v
w State# RealWorld
s of
(# State# RealWorld
s', Int#
flag, v
p #) -> case Int#
flag of
Int#
0# -> (# State# RealWorld
s', (# (##) | #) #)
Int#
_ -> (# State# RealWorld
s', (# | v
p #) #)
finalizeUnliftedWeak#
:: UnliftedWeak# v
-> State# RealWorld
-> (# State# RealWorld, (# (##) | State# RealWorld -> (# State# RealWorld, b #) #) #)
{-# INLINE finalizeUnliftedWeak# #-}
finalizeUnliftedWeak# :: forall (v :: UnliftedType) b.
UnliftedWeak# v
-> State# RealWorld
-> (# State# RealWorld,
(# (# #) | State# RealWorld -> (# State# RealWorld, b #) #) #)
finalizeUnliftedWeak# (UnliftedWeak# Weak# v
w) State# RealWorld
s =
case Weak# v
-> State# RealWorld
-> (# State# RealWorld, Int#,
State# RealWorld -> (# State# RealWorld, b #) #)
forall a b.
Weak# a
-> State# RealWorld
-> (# State# RealWorld, Int#,
State# RealWorld -> (# State# RealWorld, b #) #)
finalizeWeak# Weak# v
w State# RealWorld
s of
(# State# RealWorld
s', Int#
0#, State# RealWorld -> (# State# RealWorld, b #)
_ #) -> (# State# RealWorld
s', (# (##) | #) #)
(# State# RealWorld
s', Int#
_, State# RealWorld -> (# State# RealWorld, b #)
f #) -> (# State# RealWorld
s', (# | State# RealWorld -> (# State# RealWorld, b #)
f #) #)