{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}
module Numeric.DataFrame.ST
( STDataFrame (XSTFrame), SomeSTDataFrame (..)
, castDataFrame
, newDataFrame, newPinnedDataFrame, oneMoreDataFrame
, subDataFrameView, subDataFrameView'
, copyDataFrame, copyMutableDataFrame
, copyDataFrame', copyMutableDataFrame'
, copyDataFrameOff, copyMutableDataFrameOff
, freezeDataFrame, unsafeFreezeDataFrame
, thawDataFrame, thawPinDataFrame, unsafeThawDataFrame, withThawDataFrame
, writeDataFrame, writeDataFrameOff
, readDataFrame, readDataFrameOff
, isDataFramePinned, getDataFrameSteps
) where
import GHC.ST (ST (..))
import Data.Coerce
import Data.Kind
import Numeric.DataFrame.Internal.Mutable
import Numeric.DataFrame.Internal.PrimArray
import Numeric.DataFrame.Type
import Numeric.Dimensions
import Unsafe.Coerce
newtype STDataFrame s (t :: Type) (ns :: [k]) = STDataFrame (MDataFrame s t (ns :: [k]))
pattern XSTFrame :: forall s (t :: Type) (xns :: [XNat]) . ()
=> forall (ns :: [Nat]) . (FixedDims xns ns, Dimensions ns)
=> STDataFrame s t ns -> STDataFrame s t xns
pattern XSTFrame df <- (mkXSTFramePat -> XSTFramePat df)
where
XSTFrame = castDataFrame
{-# COMPLETE XSTFrame #-}
data XSTFramePat s (t :: Type) (xns :: [XNat])
= forall (ns :: [Nat]) . (FixedDims xns ns, Dimensions ns)
=> XSTFramePat (STDataFrame s t ns)
mkXSTFramePat :: forall s (t :: Type) (xns :: [XNat])
. STDataFrame s t xns -> XSTFramePat s t xns
mkXSTFramePat df
| SomeDims ds <- fromSteps (getDataFrameSteps df)
, XDims (Dims :: Dims ns) <- (unsafeCoerce ds) :: Dims xns
= XSTFramePat @s @t @xns @ns (unsafeCoerce df)
| otherwise
= error "XSTFrame pattern: impossible args"
data SomeSTDataFrame s (t :: Type)
= forall (ns :: [Nat]) . Dimensions ns => SomeSTDataFrame (STDataFrame s t ns)
castDataFrame ::
forall (t :: Type) (xns :: [XNat]) (ns :: [Nat]) s
. FixedDims xns ns
=> STDataFrame s t ns -> STDataFrame s t xns
castDataFrame = coerce (castDataFrame# @t @xns @ns)
{-# INLINE castDataFrame #-}
newDataFrame ::
forall (t :: Type) ns s
. (PrimBytes t, Dimensions ns) => ST s (STDataFrame s t ns)
newDataFrame = coerce (newDataFrame# @t @_ @ns)
{-# INLINE newDataFrame #-}
newPinnedDataFrame ::
forall (t :: Type) ns s
. (PrimBytes t, Dimensions ns) => ST s (STDataFrame s t ns)
newPinnedDataFrame = coerce (newPinnedDataFrame# @t @_ @ns)
{-# INLINE newPinnedDataFrame #-}
oneMoreDataFrame ::
forall (t :: Type) ns s
. STDataFrame s t ns -> ST s (STDataFrame s t ns)
oneMoreDataFrame = coerce (oneMoreDataFrame# @t @_ @ns)
{-# INLINE oneMoreDataFrame #-}
subDataFrameView ::
forall (t :: Type) b bi bd as bs asbs s
. (SubFrameIndexCtx b bi bd, KnownDim bd, ConcatList as (b :+ bs) asbs)
=> Idxs (as +: bi) -> STDataFrame s t asbs -> STDataFrame s t (bd :+ bs)
subDataFrameView = coerce (subDataFrameView# @t @_ @b @bi @bd @as @bs @asbs)
subDataFrameView' ::
forall (t :: Type) as bs asbs s
. ConcatList as bs asbs
=> Idxs as -> STDataFrame s t asbs -> STDataFrame s t bs
subDataFrameView' = coerce (subDataFrameView'# @t @_ @as @bs @asbs)
copyDataFrame ::
forall (t :: Type) b bi bd as bs asbs s
. ( SubFrameIndexCtx b bi bd, KnownDim bd, ExactDims bs
, PrimArray t (DataFrame t (bd :+ bs))
, ConcatList as (b :+ bs) asbs )
=> Idxs (as +: bi) -> DataFrame t (bd :+ bs) -> STDataFrame s t asbs -> ST s ()
copyDataFrame = coerce (copyDataFrame# @t @_ @b @bi @bd @as @bs @asbs)
{-# INLINE copyDataFrame #-}
copyMutableDataFrame ::
forall (t :: Type) b bi bd as bs asbs s
. ( SubFrameIndexCtx b bi bd
, ExactDims bs
, PrimBytes t
, ConcatList as (b :+ bs) asbs )
=> Idxs (as +: bi) -> STDataFrame s t (bd :+ bs) -> STDataFrame s t asbs -> ST s ()
copyMutableDataFrame = coerce (copyMDataFrame# @t @_ @b @bi @bd @as @bs @asbs)
{-# INLINE copyMutableDataFrame #-}
copyDataFrame' ::
forall (t :: Type) as bs asbs s
. ( ExactDims bs
, PrimArray t (DataFrame t bs)
, ConcatList as bs asbs )
=> Idxs as -> DataFrame t bs -> STDataFrame s t asbs -> ST s ()
copyDataFrame' = coerce (copyDataFrame'# @t @_ @as @bs @asbs)
{-# INLINE copyDataFrame' #-}
copyMutableDataFrame' ::
forall (t :: Type) as bs asbs s
. (ExactDims bs, PrimBytes t, ConcatList as bs asbs)
=> Idxs as -> STDataFrame s t bs -> STDataFrame s t asbs -> ST s ()
copyMutableDataFrame' = coerce (copyMDataFrame'# @t @_ @as @bs @asbs)
{-# INLINE copyMutableDataFrame' #-}
copyDataFrameOff ::
forall (t :: Type) as bs asbs s
. ( Dimensions bs
, PrimArray t (DataFrame t bs)
, ConcatList as bs asbs )
=> Int -> DataFrame t bs -> STDataFrame s t asbs -> ST s ()
copyDataFrameOff = coerce (copyDataFrameOff# @t @_ @as @bs @asbs)
{-# INLINE copyDataFrameOff #-}
copyMutableDataFrameOff ::
forall (t :: Type) as bs asbs s
. (ExactDims bs, PrimBytes t, ConcatList as bs asbs)
=> Int -> STDataFrame s t bs -> STDataFrame s t asbs -> ST s ()
copyMutableDataFrameOff = coerce (copyMDataFrameOff# @t @_ @as @bs @asbs)
{-# INLINE copyMutableDataFrameOff #-}
unsafeFreezeDataFrame ::
forall (t :: Type) ns s
. PrimArray t (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
unsafeFreezeDataFrame = coerce (unsafeFreezeDataFrame# @t @_ @ns)
{-# INLINE unsafeFreezeDataFrame #-}
freezeDataFrame ::
forall (t :: Type) ns s
. PrimArray t (DataFrame t ns)
=> STDataFrame s t ns -> ST s (DataFrame t ns)
freezeDataFrame = coerce (freezeDataFrame# @t @_ @ns)
{-# INLINE freezeDataFrame #-}
thawDataFrame ::
forall (t :: Type) ns s
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns -> ST s (STDataFrame s t ns)
thawDataFrame = coerce (thawDataFrame# @t @_ @ns)
{-# INLINE thawDataFrame #-}
thawPinDataFrame ::
forall (t :: Type) ns s
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns -> ST s (STDataFrame s t ns)
thawPinDataFrame = coerce (thawPinDataFrame# @t @_ @ns)
{-# INLINE thawPinDataFrame #-}
unsafeThawDataFrame ::
forall (t :: Type) ns s
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns
-> ST s (STDataFrame s t ns)
unsafeThawDataFrame = coerce (unsafeThawDataFrame# @t @_ @ns)
{-# INLINE unsafeThawDataFrame #-}
withThawDataFrame ::
forall (t :: Type) ns r s
. PrimArray t (DataFrame t ns)
=> (t -> ST s r)
-> (STDataFrame s t ns -> ST s r)
-> DataFrame t ns -> ST s r
withThawDataFrame = coerce (withThawDataFrame# @t @_ @ns @r)
writeDataFrameOff ::
forall (t :: Type) ns s
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> STDataFrame s t ns -> Int -> DataFrame t ('[] :: KindOf ns) -> ST s ()
writeDataFrameOff = coerce (writeDataFrameOff# @t @_ @ns)
{-# INLINE writeDataFrameOff #-}
writeDataFrame ::
forall (t :: Type) ns s
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> STDataFrame s t ns -> Idxs ns -> DataFrame t ('[] :: KindOf ns) -> ST s ()
writeDataFrame = coerce (writeDataFrame# @t @_ @ns)
{-# INLINE writeDataFrame #-}
readDataFrameOff ::
forall (t :: Type) ns s
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> STDataFrame s t ns -> Int -> ST s (DataFrame t ('[] :: KindOf ns))
readDataFrameOff = coerce (readDataFrameOff# @t @_ @ns)
{-# INLINE readDataFrameOff #-}
readDataFrame ::
forall (t :: Type) ns s
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> STDataFrame s t ns -> Idxs ns -> ST s (DataFrame t ('[] :: KindOf ns))
readDataFrame = coerce (readDataFrame# @t @_ @ns)
{-# INLINE readDataFrame #-}
isDataFramePinned ::
forall (t :: Type) ns s . STDataFrame s t ns -> Bool
isDataFramePinned = coerce (isDataFramePinned# @t @_ @ns)
{-# INLINE isDataFramePinned #-}
getDataFrameSteps ::
forall (t :: Type) ns s . STDataFrame s t ns -> CumulDims
getDataFrameSteps = coerce (getDataFrameSteps# @t @_ @ns)
{-# INLINE getDataFrameSteps #-}
_unusedTopBind :: STDataFrame s t ns
_unusedTopBind = STDataFrame undefined