{-# OPTIONS_GHC-funbox-strict-fields #-}

module HaskellWorks.Data.Excess.Triplet
  ( Triplet(..)
  ) where

import Control.Applicative (liftA3)
import Foreign.Storable    (Storable (..))

import qualified Foreign.Storable.Record as Store

data Triplet = Triplet
  { tripletMinExcess :: !Int
  , tripletAllExcess :: !Int
  , tripletMaxExcess :: !Int
  } deriving (Eq, Show)

instance Storable Triplet where
  sizeOf    = Store.sizeOf storeTriple
  alignment = Store.alignment storeTriple
  peek      = Store.peek storeTriple
  poke      = Store.poke storeTriple

storeTriple :: Store.Dictionary Triplet
storeTriple = Store.run $ liftA3 Triplet
  (Store.element tripletMinExcess)
  (Store.element tripletAllExcess)
  (Store.element tripletMaxExcess)