derive-storable: Derive Storable instances with GHC.Generics.

[ foreign, library, mit ] [ Propose Tags ]

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


[Skip to Readme]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.1.0.1, 0.1.0.2, 0.1.0.3, 0.1.0.4, 0.1.0.5, 0.1.0.6, 0.1.1.0, 0.1.1.1, 0.1.2.0, 0.2.0.0, 0.3.0.0, 0.3.1.0
Change log ChangeLog.md
Dependencies base (>=4.8 && <4.10) [details]
License MIT
Author Mateusz Kloczko
Maintainer mateusz.p.kloczko@gmail.com
Revised Revision 1 made by mkloczko at 2016-11-30T10:51:44Z
Category Foreign
Home page https://www.github.com/mkloczko/derive-storable/
Source repo head: git clone https://github.com/mkloczko/derive-storable -b master
this: git clone https://github.com/mkloczko/derive-storable -b master(tag 242562ca08001dfc9116c5698a5bcdacda0839d2)
Uploaded by mkloczko at 2016-11-30T10:48:46Z
Distributions NixOS:0.3.1.0
Downloads 8030 total (54 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2016-11-30 [all 1 reports]

Readme for derive-storable-0.1.0.4

[back to package description]

Introduction

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))

In order to achieve the same performance as for hand-written instances, take a look at derive-storable-plugin.

Usage

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