module Numeric.DataFrame.ST
( MutableFrame (), STDataFrame ()
, newDataFrame, copyDataFrame, copyMutableDataFrame
, unsafeFreezeDataFrame
, freezeDataFrame, thawDataFrame
, writeDataFrame, readDataFrame
, writeDataFrameOff, readDataFrameOff
) where
import GHC.Types (Int (..))
import GHC.ST (ST(..))
import Numeric.Commons
import Numeric.DataFrame.Type
import Numeric.DataFrame.Mutable
import Numeric.Dimensions
import Numeric.Scalar
newtype STDataFrame s t (ns :: [Nat]) = STDataFrame (MDataFrame s t (ns :: [Nat]))
newDataFrame :: forall t (ns :: [Nat]) s
. ( PrimBytes t, Dimensions ns)
=> ST s (STDataFrame s t ns)
newDataFrame = STDataFrame <$> ST (newDataFrame# @t @ns)
copyDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( PrimBytes (DataFrame t as)
, ConcatList as bs asbs
, Dimensions bs
)
=> DataFrame t as -> Idx bs -> STDataFrame s t asbs -> ST s ()
copyDataFrame df ei (STDataFrame mdf) = ST (copyDataFrame# df ei mdf)
copyMutableDataFrame :: forall t (as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( PrimBytes t
, ConcatList as bs asbs
, Dimensions bs
)
=> STDataFrame s t as -> Idx bs -> STDataFrame s t asbs -> ST s ()
copyMutableDataFrame (STDataFrame mdfA) ei (STDataFrame mdfB)
= ST (copyMDataFrame# mdfA ei mdfB)
unsafeFreezeDataFrame :: forall t (ns :: [Nat]) s
. PrimBytes (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame (STDataFrame mdf) = ST (unsafeFreezeDataFrame# mdf)
freezeDataFrame :: forall t (ns :: [Nat]) s
. PrimBytes (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
freezeDataFrame (STDataFrame mdf) = ST (freezeDataFrame# mdf)
thawDataFrame :: forall t (ns :: [Nat]) s
. PrimBytes (DataFrame t ns)
=> DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame df = STDataFrame <$> ST (thawDataFrame# df)
writeDataFrame :: forall t (ns :: [Nat]) s
. ( MutableFrame t ns, Dimensions ns )
=> STDataFrame s t ns -> Idx ns -> Scalar t -> ST s ()
writeDataFrame (STDataFrame mdf) ei = ST . writeDataFrame# mdf ei . unScalar
readDataFrame :: forall t (ns :: [Nat]) s
. ( MutableFrame t ns, Dimensions ns )
=> STDataFrame s t ns -> Idx ns -> ST s (Scalar t)
readDataFrame (STDataFrame mdf) = fmap scalar . ST . readDataFrame# mdf
writeDataFrameOff :: forall t (ns :: [Nat]) s
. ( MutableFrame t ns, Dimensions ns )
=> STDataFrame s t ns -> Int -> Scalar t -> ST s ()
writeDataFrameOff (STDataFrame mdf) (I# i) x = ST $ \s -> (# writeDataFrameOff# mdf i (unScalar x) s, () #)
readDataFrameOff :: forall t (ns :: [Nat]) s
. ( MutableFrame t ns, Dimensions ns )
=> STDataFrame s t ns -> Int -> ST s (Scalar t)
readDataFrameOff (STDataFrame mdf) (I# i) = scalar <$> ST (readDataFrameOff# mdf i)