
On 12/14/2013 05:46 PM, Nikita Karetnikov wrote:
Yes, but I also want to poke, so SomeUnion must be an instance of Storable. Could you show how to define it properly or provide a workaround?
You do not need to store the "key", or have an additional C'MyStruct data type, as you already have this information in Haskell : data SomeUnion = UnionFoo C'Foo | UnionWord64 Word64 | UnionVoid (Ptr ()) deriving (Show, Eq) instance Storable SomeUnion where sizeOf _ = 12 alignment _ = 4 peek p = do v0 <- peekByteOff p 0 case v0 of 1 -> UnionFoo `fmap` peekByteOff p 4 4 -> UnionWord64 `fmap` peekByteOff p 4 20 -> UnionVoid `fmap` peekByteOff p 4 _ -> fail "you should probably handle this case" poke p (UnionFoo v1) = pokeByteOff p 0 1 >> pokeByteOff p 4 v1 poke p (UnionWord64 v1) = pokeByteOff p 4 1 >> pokeByteOff p 4 v1 poke p (UnionVoid v1) = pokeByteOff p 20 1 >> pokeByteOff p 4 v1