{-# language MagicHash #-}
{-# language UnboxedTuples #-}
{-# language UnboxedSums #-}
{-# language TypeInType #-}
{-# 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 GHC.Exts
( TYPE, RuntimeRep (UnliftedRep), Any, unsafeCoerce#, RealWorld, State#
, Weak#, mkWeak#, mkWeakNoFinalizer#, deRefWeak#, finalizeWeak#, Addr#
, Int#, nullAddr#, addCFinalizerToWeak#)
newtype UnliftedWeak# (a :: TYPE 'UnliftedRep) = UnliftedWeak# (Weak# Any)
type role UnliftedWeak# representational
mkWeakFromUnliftedToUnlifted#
:: forall (k :: TYPE 'UnliftedRep) (v :: TYPE 'UnliftedRep) c.
k -> v -> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# NOINLINE mkWeakFromUnliftedToUnlifted# #-}
mkWeakFromUnliftedToUnlifted# :: 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 =
case k
-> Any
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# Any #)
forall a b c.
a
-> b
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# b #)
mkWeak# k
k (v -> Any
unsafeCoerce# v
v) State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s of
(# State# RealWorld
s', Weak# Any
w #) -> (# State# RealWorld
s', Weak# Any -> UnliftedWeak# v
forall (a :: TYPE 'UnliftedRep). Weak# Any -> UnliftedWeak# a
UnliftedWeak# Weak# Any
w #)
mkWeakFromUnliftedToUnliftedNoFinalizer#
:: forall (k :: TYPE 'UnliftedRep) (v :: TYPE 'UnliftedRep).
k -> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# NOINLINE mkWeakFromUnliftedToUnliftedNoFinalizer# #-}
mkWeakFromUnliftedToUnliftedNoFinalizer# :: k
-> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
mkWeakFromUnliftedToUnliftedNoFinalizer# k
k v
v State# RealWorld
s =
case k -> Any -> State# RealWorld -> (# State# RealWorld, Weak# Any #)
forall a b.
a -> b -> State# RealWorld -> (# State# RealWorld, Weak# b #)
mkWeakNoFinalizer# k
k (v -> Any
unsafeCoerce# v
v) State# RealWorld
s of
(# State# RealWorld
s', Weak# Any
w #) -> (# State# RealWorld
s', Weak# Any -> UnliftedWeak# v
forall (a :: TYPE 'UnliftedRep). Weak# Any -> UnliftedWeak# a
UnliftedWeak# Weak# Any
w #)
mkWeakToUnlifted#
:: forall k (v :: TYPE 'UnliftedRep) c.
k -> v -> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# NOINLINE mkWeakToUnlifted# #-}
mkWeakToUnlifted# :: 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 =
case k
-> Any
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# Any #)
forall a b c.
a
-> b
-> (State# RealWorld -> (# State# RealWorld, c #))
-> State# RealWorld
-> (# State# RealWorld, Weak# b #)
mkWeak# k
k (v -> Any
unsafeCoerce# v
v) State# RealWorld -> (# State# RealWorld, c #)
finalizer State# RealWorld
s of
(# State# RealWorld
s', Weak# Any
w #) -> (# State# RealWorld
s', Weak# Any -> UnliftedWeak# v
forall (a :: TYPE 'UnliftedRep). Weak# Any -> UnliftedWeak# a
UnliftedWeak# Weak# Any
w #)
mkWeakToUnliftedNoFinalizer#
:: forall k (v :: TYPE 'UnliftedRep).
k -> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
{-# NOINLINE mkWeakToUnliftedNoFinalizer# #-}
mkWeakToUnliftedNoFinalizer# :: k
-> v -> State# RealWorld -> (# State# RealWorld, UnliftedWeak# v #)
mkWeakToUnliftedNoFinalizer# k
k v
v State# RealWorld
s =
case k -> Any -> State# RealWorld -> (# State# RealWorld, Weak# Any #)
forall a b.
a -> b -> State# RealWorld -> (# State# RealWorld, Weak# b #)
mkWeakNoFinalizer# k
k (v -> Any
unsafeCoerce# v
v) State# RealWorld
s of
(# State# RealWorld
s', Weak# Any
w #) -> (# State# RealWorld
s', Weak# Any -> UnliftedWeak# v
forall (a :: TYPE 'UnliftedRep). Weak# Any -> UnliftedWeak# a
UnliftedWeak# Weak# Any
w #)
addCFinalizerToUnliftedWeak1# :: Addr# -> Addr# -> UnliftedWeak# b -> State# RealWorld -> (# State# RealWorld, Int# #)
{-# INLINE addCFinalizerToUnliftedWeak1# #-}
addCFinalizerToUnliftedWeak1# :: Addr#
-> Addr#
-> UnliftedWeak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToUnliftedWeak1# Addr#
fptr Addr#
ptr (UnliftedWeak# Weak# Any
w)
= Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# Any
-> 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# Any
w
addCFinalizerToUnliftedWeak2# :: Addr# -> Addr# -> Addr# -> UnliftedWeak# b -> State# RealWorld -> (# State# RealWorld, Int# #)
{-# INLINE addCFinalizerToUnliftedWeak2# #-}
addCFinalizerToUnliftedWeak2# :: Addr#
-> Addr#
-> Addr#
-> UnliftedWeak# b
-> State# RealWorld
-> (# State# RealWorld, Int# #)
addCFinalizerToUnliftedWeak2# Addr#
fptr Addr#
eptr Addr#
ptr (UnliftedWeak# Weak# Any
w)
= Addr#
-> Addr#
-> Int#
-> Addr#
-> Weak# Any
-> 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# Any
w
deRefUnliftedWeak#
:: UnliftedWeak# v
-> State# RealWorld
-> (# State# RealWorld, (# (##) | v #) #)
{-# NOINLINE deRefUnliftedWeak# #-}
deRefUnliftedWeak# :: UnliftedWeak# v
-> State# RealWorld -> (# State# RealWorld, (# (# #) | v #) #)
deRefUnliftedWeak# (UnliftedWeak# Weak# Any
w) State# RealWorld
s =
case (# State# RealWorld, Int#, Any #)
-> (# State# RealWorld, Int#, v #)
unsafeCoerce# (Weak# Any -> State# RealWorld -> (# State# RealWorld, Int#, Any #)
forall a.
Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, a #)
deRefWeak# Weak# Any
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# :: UnliftedWeak# v
-> State# RealWorld
-> (# State# RealWorld,
(# (# #) | State# RealWorld -> (# State# RealWorld, b #) #) #)
finalizeUnliftedWeak# (UnliftedWeak# Weak# Any
w) State# RealWorld
s =
case Weak# Any
-> 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# Any
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 #) #)