The derive-storable package

[Tags:library, mit, test]

Derive Storable instances with GHC.Generics. The derived Storable instances have the same alignment as C structs.

[Skip to Readme]


Change log
Dependencies base (>=4.8 && <4.10) [details]
License MIT
Author Mateusz Kloczko
Stability Unknown
Category Foreign
Home page
Source repository head: git clone -b master
Uploaded Wed Dec 7 18:44:32 UTC 2016 by mkloczko
Distributions NixOS:
Downloads 167 total (5 in the last 30 days)
0 []
Status Docs available [build log]
Last success reported on 2016-12-07 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for derive-storable

Readme for derive-storable-


Build Status

The derive-storable package allows you to automatically generate Storable instances for your datatypes. It uses GHC.Generics, which allows the coders to derive certain instances automatically. To derive a (G)Storable instance, the data-type has to:

  • have only one constructor.
  • all fields of the constructor need to be GStorable.
  • implement a Generic instance (derive (Generic))

Note on performance

There are some problems with performance of derived Storable instances. For now there exists a solution in form of GHC Core plugin - derive-storable-plugin.


Here's an example:

{-# LANGUAGE DeriveGeneric #-}

import Foreign.Storable
import Foreign.Storable.Generic
import Foreign.Ptr
import Foreign.Marshal.Alloc

import Generics.Deriving

data Position = Position {
   x :: Double, 
   y :: Double
} deriving (Show,Read, Generic)

instance GStorable Position

updatePosition :: Ptr Position -> Position -> IO ()
updatePosition ptr pos = poke ptr pos

main = do
    let val = Position 0.0 10.0
    ptr <- malloc :: IO (Ptr Position)      
    putStrLn "Created a ptr with value of"
    putStrLn =<< show <$> peek ptr
    updatePosition ptr val
    putStrLn "And now the value of ptr is:"   
    putStrLn =<< show <$> peek ptr