{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
module Numeric.DataFrame.ST
( STDataFrame (XSTFrame), SomeSTDataFrame (..)
, newDataFrame, newPinnedDataFrame
, copyDataFrame, copyMutableDataFrame
, copyDataFrame', copyMutableDataFrame'
, freezeDataFrame, unsafeFreezeDataFrame
, thawDataFrame, thawPinDataFrame, unsafeThawDataFrame
, writeDataFrame, writeDataFrameOff
, readDataFrame, readDataFrameOff
, isDataFramePinned
) where
import GHC.Base
import GHC.ST (ST (..))
import Numeric.DataFrame.Internal.Mutable
import Numeric.DataFrame.Internal.PrimArray
import Numeric.DataFrame.Type
import Numeric.Dimensions
data family STDataFrame s (t :: Type) (ns :: [k])
newtype instance STDataFrame s t (ns :: [Nat]) = STDataFrame (MDataFrame s t (ns :: [Nat]))
data instance STDataFrame s t (xs :: [XNat])
= forall (ns :: [Nat]) . Dimensions ns
=> XSTFrame (STDataFrame s t ns)
data SomeSTDataFrame s (t :: Type)
= forall (ns :: [Nat]) . Dimensions ns => SomeSTDataFrame (STDataFrame s t ns)
newDataFrame :: forall t (ns :: [Nat]) s
. ( PrimBytes t, Dimensions ns)
=> ST s (STDataFrame s t ns)
newDataFrame = STDataFrame <$> ST (newDataFrame# @t @ns)
{-# INLINE newDataFrame #-}
newPinnedDataFrame :: forall t (ns :: [Nat]) s
. ( PrimBytes t, Dimensions ns)
=> ST s (STDataFrame s t ns)
newPinnedDataFrame = STDataFrame <$> ST (newPinnedDataFrame# @t @ns)
{-# INLINE newPinnedDataFrame #-}
copyDataFrame :: forall (t :: Type)
(b :: Nat) (bi :: Nat) (bd :: Nat)
(as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( b ~ (bi + bd - 1)
, PrimBytes t
, PrimBytes (DataFrame t (bd :+ bs))
, ConcatList as (b :+ bs) asbs
)
=> Idxs (as +: bi) -> DataFrame t (bd :+ bs)
-> STDataFrame s t asbs -> ST s ()
copyDataFrame ei df (STDataFrame mdf) = ST (copyDataFrame# ei df mdf)
{-# INLINE copyDataFrame #-}
copyMutableDataFrame :: forall (t :: Type)
(b :: Nat) (bi :: Nat) (bd :: Nat)
(as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( b ~ (bi + bd - 1)
, PrimBytes t
, ConcatList as (b :+ bs) asbs
)
=> Idxs (as +: bi) -> STDataFrame s t (bd :+ bs)
-> STDataFrame s t asbs -> ST s ()
copyMutableDataFrame ei (STDataFrame mdfA) (STDataFrame mdfB)
= ST (copyMDataFrame# ei mdfA mdfB)
{-# INLINE copyMutableDataFrame #-}
copyDataFrame' :: forall (t :: Type)
(as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( PrimBytes t
, PrimBytes (DataFrame t bs)
, ConcatList as bs asbs
)
=> Idxs as -> DataFrame t bs
-> STDataFrame s t asbs -> ST s ()
copyDataFrame' ei df (STDataFrame mdf) = ST (copyDataFrame'# ei df mdf)
{-# INLINE copyDataFrame' #-}
copyMutableDataFrame' :: forall (t :: Type)
(as :: [Nat]) (bs :: [Nat]) (asbs :: [Nat]) s
. ( PrimBytes t
, ConcatList as bs asbs
)
=> Idxs as -> STDataFrame s t bs
-> STDataFrame s t asbs -> ST s ()
copyMutableDataFrame' ei (STDataFrame mdfA) (STDataFrame mdfB)
= ST (copyMDataFrame'# ei mdfA mdfB)
{-# INLINE copyMutableDataFrame' #-}
unsafeFreezeDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. PrimArray t (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame (STDataFrame mdf) = ST (unsafeFreezeDataFrame# mdf)
{-# INLINE unsafeFreezeDataFrame #-}
freezeDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. PrimArray t (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
freezeDataFrame (STDataFrame mdf) = ST (freezeDataFrame# mdf)
{-# INLINE freezeDataFrame #-}
thawDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. (Dimensions ns, PrimBytes (DataFrame t ns))
=> DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame df = STDataFrame <$> ST (thawDataFrame# df)
{-# INLINE thawDataFrame #-}
thawPinDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. (Dimensions ns, PrimBytes (DataFrame t ns))
=> DataFrame t ns -> ST s (STDataFrame s t ns)
thawPinDataFrame df = STDataFrame <$> ST (thawPinDataFrame# df)
{-# INLINE thawPinDataFrame #-}
unsafeThawDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. ( Dimensions ns
, PrimBytes (DataFrame t ns), PrimBytes t)
=> DataFrame t ns -> ST s (STDataFrame s t ns)
unsafeThawDataFrame df = STDataFrame <$> ST (unsafeThawDataFrame# df)
{-# INLINE unsafeThawDataFrame #-}
writeDataFrame :: forall t (ns :: [Nat]) s
. PrimBytes t
=> STDataFrame s t ns -> Idxs ns -> DataFrame t ('[] :: [Nat]) -> ST s ()
writeDataFrame (STDataFrame mdf) ei = ST . writeDataFrame# mdf ei . unsafeCoerce#
{-# INLINE writeDataFrame #-}
readDataFrame :: forall (t :: Type) (ns :: [Nat]) s
. PrimBytes t
=> STDataFrame s t ns -> Idxs ns -> ST s (DataFrame t ('[] :: [Nat]))
readDataFrame (STDataFrame mdf) = unsafeCoerce# . ST . readDataFrame# mdf
{-# INLINE readDataFrame #-}
writeDataFrameOff :: forall (t :: Type) (ns :: [Nat]) s
. PrimBytes t
=> STDataFrame s t ns -> Int -> DataFrame t ('[] :: [Nat]) -> ST s ()
writeDataFrameOff (STDataFrame mdf) (I# i)
= ST . writeDataFrameOff# mdf i . unsafeCoerce#
{-# INLINE writeDataFrameOff #-}
readDataFrameOff :: forall (t :: Type) (ns :: [Nat]) s
. PrimBytes t
=> STDataFrame s t ns -> Int -> ST s (DataFrame t ('[] :: [Nat]))
readDataFrameOff (STDataFrame mdf) (I# i)
= unsafeCoerce# (ST (readDataFrameOff# mdf i))
{-# INLINE readDataFrameOff #-}
isDataFramePinned :: forall (k :: Type) (t :: Type) (ns :: [k]) s
. KnownDimKind k
=> STDataFrame s t ns -> Bool
isDataFramePinned df = case dimKind @k of
DimNat -> case df of
STDataFrame x -> isDataFramePinned# x
DimXNat -> case df of
XSTFrame (STDataFrame x) -> isDataFramePinned# x