{-# OPTIONS_GHC -O -ddump-simpl-stats -fglasgow-exts #-} {- -dverbose-core2core -} module Main (main) where import Data.StorableVector (Vector) import qualified Data.StorableVector as SV import qualified Data.StorableVector.Base as VectorB import Foreign.Storable (Storable) import Foreign.Ptr (minusPtr) import Foreign.ForeignPtr (withForeignPtr) import Foreign.Marshal (advancePtr) import System.IO (openBinaryFile, hClose, hPutBuf, IOMode(WriteMode), Handle) import Control.Exception (bracket) import Data.Int (Int16) hPutSV :: Storable a => Handle -> Vector a -> IO () hPutSV h v = let (fptr, s, l) = VectorB.toForeignPtr v in withForeignPtr fptr $ \ ptr -> let ptrS = advancePtr ptr s ptrE = advancePtr ptrS l -- use advancePtr and minusPtr in order to respect alignment in hPutBuf h ptrS (minusPtr ptrE ptrS) writeFileSV :: Storable x => FilePath -> Vector x -> IO () writeFileSV path = bracket (openBinaryFile path WriteMode) hClose . flip hPutSV main :: IO () main = writeFileSV "storable.sw" (fst $ SV.unfoldrN 10000000 (\x -> let y = mod (succ x) 10000 in Just (x,y)) (0::Int16)) {- ghc -Idist/build -o dist/build/storabletest-haskell -Wall -O2 -fexcess-precision -ddump-simpl-stats -ddump-simpl-iterations -ddump-asm -i -idist/build/autogen -isrc -idist/build/fusiontest/fusiontest-tmp -odir dist/build/fusiontest/fusiontest-tmp -hidir dist/build/fusiontest/fusiontest-tmp -package base-1.0 -package mtl-1.0 -package storablevector-0.1 src/StorableTest.hs -}