--------------------------------------------------------------------------------
-- |
-- Module : Data.Measured.Size
-- Copyright : (C) Frank Staals
-- License : see the LICENSE file
-- Maintainer : Frank Staals
--------------------------------------------------------------------------------
module Data.Measured.Size where
import Control.DeepSeq
import Data.Measured.Class
import GHC.Generics (Generic)
--------------------------------------------------------------------------------
-- | Measured size. Always non-negative.
newtype Size = Size Word deriving (Show,Read,Eq,Num,Integral,Enum,Real,Ord,Generic,NFData)
instance Semigroup Size where
x <> y = x + y
instance Monoid Size where
mempty = Size 0
--------------------------------------------------------------------------------
-- | Newtype wrapper for things for which we can measure the size
newtype Elem a = Elem { _unElem :: a }
deriving (Show,Read,Eq,Ord,Functor,Foldable,Traversable)
instance Measured Size (Elem a) where
measure _ = 1
--------------------------------------------------------------------------------
-- | Things that have a size
data Sized a = Sized {-# UNPACK #-} !Size a
deriving (Show,Eq,Ord,Functor,Foldable,Traversable,Generic)
instance NFData a => NFData (Sized a)
instance Semigroup a => Semigroup (Sized a) where
(Sized i a) <> (Sized j b) = Sized (i <> j) (a <> b)
instance Monoid a => Monoid (Sized a) where
mempty = Sized mempty mempty
-- instance Semigroup a => Measured Size (Sized a) where
-- measure (Sized i _) = i