{-# 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.IO
( IODataFrame (XIOFrame), SomeIODataFrame (..)
, castDataFrame
, newDataFrame, newPinnedDataFrame, oneMoreDataFrame
, subDataFrameView, subDataFrameView'
, copyDataFrame, copyMutableDataFrame
, copyDataFrame', copyMutableDataFrame'
, copyDataFrameOff, copyMutableDataFrameOff
, freezeDataFrame, unsafeFreezeDataFrame
, thawDataFrame, thawPinDataFrame, unsafeThawDataFrame, withThawDataFrame
, writeDataFrame, writeDataFrameOff
, readDataFrame, readDataFrameOff
, isDataFramePinned, getDataFrameSteps
, withDataFramePtr
) where
import GHC.IO (IO (..))
import GHC.Ptr (Ptr (..))
import Control.Monad.ST (RealWorld)
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 IODataFrame (t :: Type) (ns :: [k]) = IODataFrame (MDataFrame RealWorld t (ns :: [k]))
pattern XIOFrame :: forall (t :: Type) (xns :: [XNat]) . ()
=> forall (ns :: [Nat]) . (FixedDims xns ns, Dimensions ns)
=> IODataFrame t ns -> IODataFrame t xns
pattern XIOFrame df <- (mkXIOFramePat -> XIOFramePat df)
where
XIOFrame = castDataFrame
{-# COMPLETE XIOFrame #-}
data XIOFramePat (t :: Type) (xns :: [XNat])
= forall (ns :: [Nat]) . (FixedDims xns ns, Dimensions ns)
=> XIOFramePat (IODataFrame t ns)
mkXIOFramePat :: forall (t :: Type) (xns :: [XNat])
. IODataFrame t xns -> XIOFramePat t xns
mkXIOFramePat df
| SomeDims ds <- fromSteps (getDataFrameSteps df)
, XDims (Dims :: Dims ns) <- (unsafeCoerce ds) :: Dims xns
= XIOFramePat @t @xns @ns (unsafeCoerce df)
| otherwise
= error "XIOFrame pattern: impossible args"
data SomeIODataFrame (t :: Type)
= forall (ns :: [Nat]) . Dimensions ns => SomeIODataFrame (IODataFrame t ns)
castDataFrame ::
forall (t :: Type) (xns :: [XNat]) (ns :: [Nat])
. FixedDims xns ns
=> IODataFrame t ns -> IODataFrame t xns
castDataFrame = coerce (castDataFrame# @t @xns @ns)
{-# INLINE castDataFrame #-}
newDataFrame ::
forall (t :: Type) ns
. (PrimBytes t, Dimensions ns) => IO (IODataFrame t ns)
newDataFrame = coerce (newDataFrame# @t @_ @ns)
{-# INLINE newDataFrame #-}
newPinnedDataFrame ::
forall (t :: Type) ns
. (PrimBytes t, Dimensions ns) => IO (IODataFrame t ns)
newPinnedDataFrame = coerce (newPinnedDataFrame# @t @_ @ns)
{-# INLINE newPinnedDataFrame #-}
oneMoreDataFrame ::
forall (t :: Type) ns
. IODataFrame t ns -> IO (IODataFrame t ns)
oneMoreDataFrame = coerce (oneMoreDataFrame# @t @_ @ns)
{-# INLINE oneMoreDataFrame #-}
subDataFrameView ::
forall (t :: Type) b bi bd as bs asbs
. (SubFrameIndexCtx b bi bd, KnownDim bd, ConcatList as (b :+ bs) asbs)
=> Idxs (as +: bi) -> IODataFrame t asbs -> IODataFrame t (bd :+ bs)
subDataFrameView = coerce (subDataFrameView# @t @_ @b @bi @bd @as @bs @asbs)
subDataFrameView' ::
forall (t :: Type) as bs asbs
. ConcatList as bs asbs
=> Idxs as -> IODataFrame t asbs -> IODataFrame t bs
subDataFrameView' = coerce (subDataFrameView'# @t @_ @as @bs @asbs)
copyDataFrame ::
forall (t :: Type) b bi bd as bs asbs
. ( 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) -> IODataFrame t asbs -> IO ()
copyDataFrame = coerce (copyDataFrame# @t @_ @b @bi @bd @as @bs @asbs)
{-# INLINE copyDataFrame #-}
copyMutableDataFrame ::
forall (t :: Type) b bi bd as bs asbs
. ( SubFrameIndexCtx b bi bd
, ExactDims bs
, PrimBytes t
, ConcatList as (b :+ bs) asbs )
=> Idxs (as +: bi) -> IODataFrame t (bd :+ bs) -> IODataFrame t asbs -> IO ()
copyMutableDataFrame = coerce (copyMDataFrame# @t @_ @b @bi @bd @as @bs @asbs)
{-# INLINE copyMutableDataFrame #-}
copyDataFrame' ::
forall (t :: Type) as bs asbs
. ( ExactDims bs
, PrimArray t (DataFrame t bs)
, ConcatList as bs asbs )
=> Idxs as -> DataFrame t bs -> IODataFrame t asbs -> IO ()
copyDataFrame' = coerce (copyDataFrame'# @t @_ @as @bs @asbs)
{-# INLINE copyDataFrame' #-}
copyMutableDataFrame' ::
forall (t :: Type) as bs asbs
. (ExactDims bs, PrimBytes t, ConcatList as bs asbs)
=> Idxs as -> IODataFrame t bs -> IODataFrame t asbs -> IO ()
copyMutableDataFrame' = coerce (copyMDataFrame'# @t @_ @as @bs @asbs)
{-# INLINE copyMutableDataFrame' #-}
copyDataFrameOff ::
forall (t :: Type) as bs asbs
. ( Dimensions bs
, PrimArray t (DataFrame t bs)
, ConcatList as bs asbs )
=> Int -> DataFrame t bs -> IODataFrame t asbs -> IO ()
copyDataFrameOff = coerce (copyDataFrameOff# @t @_ @as @bs @asbs)
{-# INLINE copyDataFrameOff #-}
copyMutableDataFrameOff ::
forall (t :: Type) as bs asbs
. (ExactDims bs, PrimBytes t, ConcatList as bs asbs)
=> Int -> IODataFrame t bs -> IODataFrame t asbs -> IO ()
copyMutableDataFrameOff = coerce (copyMDataFrameOff# @t @_ @as @bs @asbs)
{-# INLINE copyMutableDataFrameOff #-}
unsafeFreezeDataFrame ::
forall (t :: Type) ns
. PrimArray t (DataFrame t ns)
=> IODataFrame t ns -> IO (DataFrame t ns)
unsafeFreezeDataFrame = coerce (unsafeFreezeDataFrame# @t @_ @ns)
{-# INLINE unsafeFreezeDataFrame #-}
freezeDataFrame ::
forall (t :: Type) ns
. PrimArray t (DataFrame t ns)
=> IODataFrame t ns -> IO (DataFrame t ns)
freezeDataFrame = coerce (freezeDataFrame# @t @_ @ns)
{-# INLINE freezeDataFrame #-}
thawDataFrame ::
forall (t :: Type) ns
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns -> IO (IODataFrame t ns)
thawDataFrame = coerce (thawDataFrame# @t @_ @ns)
{-# INLINE thawDataFrame #-}
thawPinDataFrame ::
forall (t :: Type) ns
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns -> IO (IODataFrame t ns)
thawPinDataFrame = coerce (thawPinDataFrame# @t @_ @ns)
{-# INLINE thawPinDataFrame #-}
unsafeThawDataFrame ::
forall (t :: Type) ns
. (Dimensions ns, PrimArray t (DataFrame t ns))
=> DataFrame t ns
-> IO (IODataFrame t ns)
unsafeThawDataFrame = coerce (unsafeThawDataFrame# @t @_ @ns)
{-# INLINE unsafeThawDataFrame #-}
withThawDataFrame ::
forall (t :: Type) ns r
. PrimArray t (DataFrame t ns)
=> (t -> IO r)
-> (IODataFrame t ns -> IO r)
-> DataFrame t ns -> IO r
withThawDataFrame = coerce (withThawDataFrame# @t @_ @ns @r)
writeDataFrameOff ::
forall (t :: Type) ns
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> IODataFrame t ns -> Int -> DataFrame t ('[] :: KindOf ns) -> IO ()
writeDataFrameOff = coerce (writeDataFrameOff# @t @_ @ns)
{-# INLINE writeDataFrameOff #-}
writeDataFrame ::
forall (t :: Type) ns
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> IODataFrame t ns -> Idxs ns -> DataFrame t ('[] :: KindOf ns) -> IO ()
writeDataFrame = coerce (writeDataFrame# @t @_ @ns)
{-# INLINE writeDataFrame #-}
readDataFrameOff ::
forall (t :: Type) ns
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> IODataFrame t ns -> Int -> IO (DataFrame t ('[] :: KindOf ns))
readDataFrameOff = coerce (readDataFrameOff# @t @_ @ns)
{-# INLINE readDataFrameOff #-}
readDataFrame ::
forall (t :: Type) ns
. PrimBytes (DataFrame t ('[] :: KindOf ns))
=> IODataFrame t ns -> Idxs ns -> IO (DataFrame t ('[] :: KindOf ns))
readDataFrame = coerce (readDataFrame# @t @_ @ns)
{-# INLINE readDataFrame #-}
isDataFramePinned ::
forall (t :: Type) ns . IODataFrame t ns -> Bool
isDataFramePinned = coerce (isDataFramePinned# @t @_ @ns)
{-# INLINE isDataFramePinned #-}
getDataFrameSteps ::
forall (t :: Type) ns . IODataFrame t ns -> CumulDims
getDataFrameSteps = coerce (getDataFrameSteps# @t @_ @ns)
{-# INLINE getDataFrameSteps #-}
withDataFramePtr ::
forall (t :: Type) ns (r :: Type)
. PrimBytes t => IODataFrame t ns -> (Ptr t -> IO r) -> IO r
withDataFramePtr (IODataFrame x) k
= IO (withDataFramePtr# x (\p -> case k (Ptr p) of IO f -> f))
{-# INLINE withDataFramePtr #-}