{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE TypeSynonymInstances #-} module HaskellWorks.Data.Positioning ( Count , Position , lastPositionOf , toCount , toPosition ) where import Data.Int import Data.Word -- | A value representing a count type Count = Word64 -- | A value representing a position type Position = Int64 class ToPosition a where -- | Convert to a position toPosition :: a -> Position instance ToPosition Count where toPosition = fromIntegral {-# INLINE toPosition #-} class ToCount a where -- | Convert a count to a count toCount :: a -> Count instance ToCount Position where toCount = fromIntegral {-# INLINE toCount #-} -- | Get largest position in a sequenced container of size count. lastPositionOf :: Count -> Position lastPositionOf c = fromIntegral c - 1 {-# INLINE lastPositionOf #-}