[Haskell-cafe] ANNOUNCE: storable-endian
Eugene Kirpichov
ekirpichov at gmail.com
Fri Dec 24 08:49:33 CET 2010
Hello Hennig,
Thanks for the suggestions!
I've released storable-endian 0.2.0, which does not use TH and bases
on your suggestion (though it has a bit of boilerplate because of
abandoning TH, but I don't think that's critical).
Here's the new source:
https://github.com/jkff/storable-endian/blob/master/Data/Storable/Endian.hs
2010/12/23 Henning Thielemann <lemming at henning-thielemann.de>:
>
> On Thu, 23 Dec 2010, Henning Thielemann wrote:
>
>> On Wed, 22 Dec 2010, Eugene Kirpichov wrote:
>>
>>> It defines types like {{Int,Word}{16,32,64},Double,Float}{LE,BE} (for
>>> example Int32BE) etc. with a corresponding Storable instance.
>>
>> How about type constructors LittleEndian and BigEndian?
>>
>> newtype LittleEndian a = LittleEndian a
>>
>> Maybe using some type classes you can even get rid of Template Haskell and
>> get plain Haskell 98?
>
> Yes, I think you could have (given a module Data.Storable.LittleEndian as
> LE)
>
> instance LE.Storable a => Storable (LittleEndian a) where
> sizeOf (LittleEndian a) = sizeOf a
> alignment (LittleEndian a) = alignment a
> peek p = fmap LittleEndian $ LE.peek p
> poke p (LittleEndian a) = LE.poke p a
>
> class LE.Storable a where
> LE.peek :: Ptr a -> IO a
> LE.poke :: Ptr a -> a -> IO ()
>
> instance LE.Storable Word16 where
> LE.peek p = getWord16le (castPtr p)
> LE.poke p = putWord16le (castPtr p)
>
> ...
>
> I find this much cleaner and simpler to extend to other types.
>
--
Eugene Kirpichov
Senior Software Engineer,
Grid Dynamics http://www.griddynamics.com/
More information about the Haskell-Cafe
mailing list