{-# OPTIONS_GHC-funbox-strict-fields #-} module HaskellWorks.Data.Excess.Triplet ( Triplet(..) ) where import Control.Applicative (pure) import Foreign.Ptr (castPtr) import Foreign.Storable (Storable (..)) data Triplet = Triplet { tripletMinExcess :: !Int , tripletAllExcess :: !Int , tripletMaxExcess :: !Int } deriving (Eq, Show) instance Storable Triplet where sizeOf _ = sizeOf (0 :: Int) * 3 alignment _ = alignment (0 :: Int) peek p = do let q = castPtr p a <- peek q b <- peekElemOff q 1 c <- peekElemOff q 2 pure (Triplet a b c) poke p t = do let q = castPtr p poke q (tripletMinExcess t) pokeElemOff q 1 (tripletAllExcess t) pokeElemOff q 2 (tripletMaxExcess t)