module Language.R.GC
( automatic
, automaticSome
) where
import Control.Memory.Region
import Control.Monad.R.Class
import Control.Exception
import Foreign.R (SomeSEXP(..))
import qualified Foreign.R as R
import System.Mem.Weak (addFinalizer)
automatic :: MonadR m => R.SEXP s a -> m (R.SEXP G a)
automatic :: forall (m :: * -> *) s (a :: SEXPTYPE).
MonadR m =>
SEXP s a -> m (SEXP G a)
automatic SEXP s a
s = forall (m :: * -> *) a. MonadR m => IO a -> m a
io forall a b. (a -> b) -> a -> b
$ forall a. IO a -> IO a
mask_ forall a b. (a -> b) -> a -> b
$ do
forall s (a :: SEXPTYPE). SEXP s a -> IO ()
R.preserveObject forall {r}. SEXP r a
s'
forall {r}. SEXP r a
s' forall key. key -> IO () -> IO ()
`addFinalizer` (forall s (a :: SEXPTYPE). SEXP s a -> IO ()
R.releaseObject (forall s (a :: SEXPTYPE) r. SEXP s a -> SEXP r a
R.unsafeRelease forall {r}. SEXP r a
s'))
forall (m :: * -> *) a. Monad m => a -> m a
return forall {r}. SEXP r a
s'
where
s' :: SEXP r a
s' = forall s (a :: SEXPTYPE) r. SEXP s a -> SEXP r a
R.unsafeRelease SEXP s a
s
automaticSome :: MonadR m => R.SomeSEXP s -> m (R.SomeSEXP G)
automaticSome :: forall (m :: * -> *) s. MonadR m => SomeSEXP s -> m (SomeSEXP G)
automaticSome (SomeSEXP SEXP s a
s) = forall (m :: * -> *) a. MonadR m => IO a -> m a
io forall a b. (a -> b) -> a -> b
$ forall a. IO a -> IO a
mask_ forall a b. (a -> b) -> a -> b
$ do
forall s (a :: SEXPTYPE). SEXP s a -> IO ()
R.preserveObject forall {r}. SEXP r a
s'
forall {r}. SEXP r a
s' forall key. key -> IO () -> IO ()
`addFinalizer` (forall s (a :: SEXPTYPE). SEXP s a -> IO ()
R.releaseObject forall {r}. SEXP r a
s')
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall s (a :: SEXPTYPE). SEXP s a -> SomeSEXP s
SomeSEXP forall {r}. SEXP r a
s'
where
s' :: SEXP r a
s' = forall s (a :: SEXPTYPE) r. SEXP s a -> SEXP r a
R.unsafeRelease SEXP s a
s