module Data.Measured.Size where
import Control.DeepSeq
import Data.Measured.Class
import GHC.Generics (Generic)
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 Elem a = Elem { _unElem :: a }
deriving (Show,Read,Eq,Ord,Functor,Foldable,Traversable)
instance Measured Size (Elem a) where
measure _ = 1
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