avro-0.1.0.0: src/Data/Avro/Zag.hs
{-# LANGUAGE TypeFamilies #-}
module Data.Avro.Zag
( Zag(..)
) where
import Data.Bits
import Data.Int
import Data.Word
class Zag a where
type Zagged a
zag :: a -> Zagged a
instance Zag Word8 where
type Zagged Word8 = Int8
zag n = fromIntegral $ (n `shiftR` 1) `xor` negate (n .&. 0x1)
{-# INLINE zag #-}
instance Zag Word16 where
type Zagged Word16 = Int16
zag n = fromIntegral $ (n `shiftR` 1) `xor` negate (n .&. 0x1)
{-# INLINE zag #-}
instance Zag Word32 where
type Zagged Word32 = Int32
zag n = fromIntegral $ (n `shiftR` 1) `xor` negate (n .&. 0x1)
{-# INLINE zag #-}
instance Zag Word64 where
type Zagged Word64 = Int64
zag n = fromIntegral $ (n `shiftR` 1) `xor` negate (n .&. 0x1)
{-# INLINE zag #-}
instance Zag Word where
type Zagged Word = Int
zag n = fromIntegral $ (n `shiftR` 1) `xor` negate (n .&. 0x1)
{-# INLINE zag #-}