NaperianNetCDF-0.1.0.0: Data/Naperian/NetCDF.hs
{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Naperian.NetCDF () where
import Data.NetCDF.Store
import Naperian
import GHC.TypeNats
import Data.Proxy
import GHC.ForeignPtr
import GHC.Ptr
import Foreign.Storable
import qualified Data.Vector.Storable as SV
import Data.Maybe ( fromJust )
import Data.Foldable ( toList )
import Control.Monad
instance (KnownNat n, Storable e) => Storable (Vector n e) where
poke p v = zipWithM_ poke qs (toList v)
where
qs = map (\i -> plusPtr q (l * i)) [0 .. n - 1]
n = fromIntegral $ natVal (Proxy :: Proxy n)
l = sizeOf (undefined :: e)
q = castPtr p
peek p = do vs <- mapM peek qs
return $ fromJust $ fromList vs
where
q :: Ptr e
q = castPtr p
qs = map (\i -> plusPtr q (l * i)) [0 .. n - 1]
l = sizeOf (undefined :: e)
n = fromIntegral $ natVal (Proxy :: Proxy n)
sizeOf _ = n * sizeOf (undefined :: e)
where
n = fromIntegral $ natVal (Proxy :: Proxy n)
alignment _ = alignment (undefined :: e)
instance NcStore (Hyper '[]) where
toForeignPtr = fst . SV.unsafeToForeignPtr0 . SV.fromList . elements
fromForeignPtr p _ = Scalar . head . SV.toList $ SV.unsafeFromForeignPtr0 p 1
smap = error "smap: NcStore (Hyper '[])"
instance (KnownNat n, Shapely fs, NcStore (Hyper fs)) =>
NcStore (Hyper ((Vector n) : fs)) where
type NcStoreExtraCon (Hyper ((Vector n) : fs)) e = NcStoreExtraCon (Hyper fs) (Vector n e)
toForeignPtr :: forall e . Storable e =>
Hyper ((Vector n) : fs) e -> ForeignPtr e
toForeignPtr = fst . SV.unsafeToForeignPtr0 . SV.fromList . elements
fromForeignPtr :: forall e . (Storable e , NcStoreExtraCon (Hyper fs) (Vector n e)) =>
ForeignPtr e -> [Int] -> Hyper ((Vector n) : fs) e
fromForeignPtr p _ = Prism ws
where
q :: ForeignPtr (Vector n e)
q = castForeignPtr p
ws :: Hyper fs (Vector n e)
ws = fromForeignPtr q undefined
smap = error "smap: NcStore (Hyper ((Vector n) : fs))"