Elegant definition of Storable instances for records.
With this package you can build a Storable instance of a record type from Storable instances of its elements in an elegant way. It does not do any magic, just a bit arithmetic to compute the right offsets, that would be otherwise done manually or by a preprocessor like C2HS. I cannot promise that the generated memory layout is compatible with that of a corresponding C struct. However, the module generates the smallest layout that is possible with respect to the alignment of the record elements. If you encounter, that a record does not have a compatible layout, we should fix that. But also without C compatibility this package is useful e.g. in connection with StorableVector.
We provide Storable instance support for several cases:
If you wrap a type in a
newtype
, then you can lift itsStorable
instance to thatnewtype
with the moduleForeign.Storable.Newtype
. This way you do not need theGeneralizedNewtypeDeriving
feature of GHC.If you have a type that is an instance of
Traversable
, you can use that feature for implementation ofStorable
methods. The moduleForeign.Storable.Traversable
allows manipulation of the portion of your type, that is accessible byTraversable
methods. For instance with the typedata T a = Cons Int [a]
and an accordingTraversable
implementation, you can load and store the elements of the contained list. This may be part of aStorable
implementation of the whole type.If you have a record containing elements of various types, then you need module
Foreign.Storable.Record
.
Note however that the Storable instances defined with this package are quite slow in (up to) GHC-6.12.1. I'm afraid this is due to incomplete inlining, but we have still to investigate the problem.
For examples see packages storable-tuple
and sample-frame
.