{-# 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 (Item k a -> Item k a -> Bool
(Item k a -> Item k a -> Bool)
-> (Item k a -> Item k a -> Bool) -> Eq (Item k a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall k a. (Eq k, Eq a) => Item k a -> Item k a -> Bool
/= :: Item k a -> Item k a -> Bool
$c/= :: forall k a. (Eq k, Eq a) => Item k a -> Item k a -> Bool
== :: Item k a -> Item k a -> Bool
$c== :: forall k a. (Eq k, Eq a) => Item k a -> Item k a -> Bool
Eq, Int -> Item k a -> ShowS
[Item k a] -> ShowS
Item k a -> String
(Int -> Item k a -> ShowS)
-> (Item k a -> String) -> ([Item k a] -> ShowS) -> Show (Item k a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k a. (Show k, Show a) => Int -> Item k a -> ShowS
forall k a. (Show k, Show a) => [Item k a] -> ShowS
forall k a. (Show k, Show a) => Item k a -> String
showList :: [Item k a] -> ShowS
$cshowList :: forall k a. (Show k, Show a) => [Item k a] -> ShowS
show :: Item k a -> String
$cshow :: forall k a. (Show k, Show a) => Item k a -> String
showsPrec :: Int -> Item k a -> ShowS
$cshowsPrec :: forall k a. (Show k, Show a) => Int -> Item k a -> ShowS
Show, (forall x. Item k a -> Rep (Item k a) x)
-> (forall x. Rep (Item k a) x -> Item k a) -> Generic (Item k a)
forall x. Rep (Item k a) x -> Item k a
forall x. Item k a -> Rep (Item k a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k a x. Rep (Item k a) x -> Item k a
forall k a x. Item k a -> Rep (Item k a) x
$cto :: forall k a x. Rep (Item k a) x -> Item k a
$cfrom :: forall k a x. Item k a -> Rep (Item k a) x
Generic, Item k a -> ()
(Item k a -> ()) -> NFData (Item k a)
forall a. (a -> ()) -> NFData a
forall k a. (NFData k, NFData a) => Item k a -> ()
rnf :: Item k a -> ()
$crnf :: forall k a. (NFData k, NFData a) => Item k a -> ()
NFData)

instance Functor (Item k) where
    fmap :: (a -> b) -> Item k a -> Item k b
fmap a -> b
f (Item k
i a
t) = k -> b -> Item k b
forall k a. k -> a -> Item k a
Item k
i (a -> b
f a
t)

instance Foldable (Item k) where
    foldMap :: (a -> m) -> Item k a -> m
foldMap a -> m
f (Item k
_ a
x) = a -> m
f a
x

instance Traversable (Item k) where
    traverse :: (a -> f b) -> Item k a -> f (Item k b)
traverse a -> f b
f (Item k
i a
x) = k -> b -> Item k b
forall k a. k -> a -> Item k a
Item k
i (b -> Item k b) -> f b -> f (Item k b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
x

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