{-# LANGUAGE Trustworthy #-}
module Data.StorableVector.CArray where

import qualified Data.StorableVector.Base as SV
import qualified Data.StorableVector as V

import qualified Data.Array.CArray.Base as CArray

import Foreign.Storable (Storable, )

import Data.Tuple.HT (swap, snd3, )



to :: (Storable e) =>
   SV.Vector e -> CArray.CArray Int e
to v =
   let checkZeroBase vf else_ =
          let vo = SV.toForeignPtr vf
          in  if snd3 vo == 0
                then vo
                else else_
       (ptr, _s, l) =
          checkZeroBase v $
          checkZeroBase (V.copy v) $
          error "StorableVectorCArray.to: we expect that StorableVector.copy generates a 0-based vector"
   in  CArray.CArray 0 (l-1) l ptr
{-
   CArray.unsafeForeignPtrToCArray
      (advancePtr s ptr) (0,l-1)
-}

from :: (Storable e) =>
   CArray.CArray Int e -> SV.Vector e
from =
   uncurry SV.fromForeignPtr . swap . CArray.toForeignPtr