const-0: src/Foreign/Const/Concurrent.hs
{-# language UndecidableSuperClasses #-}
{-# language ScopedTypeVariables #-}
{-# language FlexibleContexts #-}
{-# language TypeApplications #-}
{-# language ConstraintKinds #-}
{-# language TypeFamilies #-}
{-# language Trustworthy #-}
-- |
-- Copyright : (c) 2019 Edward Kmett
-- License : BSD-2-Clause OR Apache-2.0
-- Maintainer: Edward Kmett <ekmett@gmail.com>
-- Stability : experimental
-- Portability: non-portable
--
module Foreign.Const.Concurrent
( newConstForeignPtr
, addAForeignPtrFinalizer
) where
import Data.Coerce
import Data.Type.Coercion
import Foreign.Concurrent
import Data.Const.Unsafe
-- | Analogous to 'Concurrent.newForeignPtr'
newConstForeignPtr :: forall p a. APtr p => p a -> IO () -> IO (ConstForeignPtr a)
newConstForeignPtr = gcoerceWith (unsafePtrCoercion @p @a) $ coerce $ newForeignPtr @a
{-# inline newConstForeignPtr #-}
-- | Analogous to 'Concurrent.addForeignPtrFinalizer'
addAForeignPtrFinalizer :: forall fp a. AForeignPtr fp => fp a -> IO () -> IO ()
addAForeignPtrFinalizer = gcoerceWith (unsafeForeignPtrCoercion @fp @a) $ coerce $ addForeignPtrFinalizer @a
{-# inline addAForeignPtrFinalizer #-}