<div dir="ltr"><div>I think I've managed to come up with an easy, useful, and sound way for mere mortals to use unboxed vectors with arbitrary datatypes, without using template Haskell. </div><div><br></div><div>I had a need for this capability, googled about it, and I didn't find a satisfying way to do it.  This technique seemed useful and simple enough to go into the vector library, but there's so much stuff going on in there I'm not ready to submit a patch.</div><div><br></div><div>A user just needs to create an UnboxEquivalent instance for their type, and then they can work with what looks and acts like a vector of their type, but is in fact backed by a newtype-wrapped unboxed vector of the equivalent type.</div><div><br></div><div><div>newtype SmallPos = Pos Int</div><div>    deriving (Eq, Ord, Show)</div><div><br></div><div>smallPos :: Int -> SmallPos</div><div>smallPos x | x > 0 && x < 100 = Pos x</div><div>           | otherwise = error "bad SmallPos"</div><div><br></div><div>instance UnboxEquivalent SmallPos where</div><div>    type UnboxEquiv SmallPos = Word8</div><div>    toUnbox (Pos x) = fromIntegral x</div><div>    fromUnbox x = (Pos (fromIntegral x))</div><div><br></div><div>test1 :: EVector SmallPos</div><div>test1 = Data.Vector.Generic.fromList $ map smallPos [5..15]</div></div><div><br></div><div>UnboxEquivalent.hs is at <a href="http://lpaste.net/136381">http://lpaste.net/136381</a></div><div>Some really simple test code is at <a href="http://lpaste.net/136382">http://lpaste.net/136382</a></div><div><br></div><div>I haven't performance tested it, or stuck {-# INLINE #-} annotations in, but I think everything should be optimizing away to nothing, except of course for the toUnbox and fromUnbox calls.</div><div><br></div>What do you think?<div><br clear="all"><div><div class="gmail_signature">-Ken<br></div></div>
</div></div>