{-# LANGUAGE DeriveAnyClass        #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module HaskellWorks.Data.Item.Strict where

import Control.DeepSeq                     (NFData)
import GHC.Generics                        (Generic)
import HaskellWorks.Data.FingerTree.Strict

data Item k a = Item !k !a deriving (Eq, Show, Generic, NFData)

instance Functor (Item k) where
    fmap f (Item i t) = Item i (f t)

instance Foldable (Item k) where
    foldMap f (Item _ x) = f x

instance Traversable (Item k) where
    traverse f (Item i x) = Item i <$> f x

instance (Monoid k) => Measured k (Item k a) where
  measure (Item k _) = k