{-# LANGUAGE DeriveDataTypeable         #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE Trustworthy                #-}

--------------------------------------------------------------------
-- |
-- Module    : Data.MessagePack.Types.Assoc
-- Copyright : (c) Daiki Handa, 2010-2011
-- License   : BSD3
--
-- Maintainer:  tanaka.hideyuki@gmail.com
-- Stability :  experimental
-- Portability: portable
--
-- MessagePack map labeling type
--
--------------------------------------------------------------------

module Data.MessagePack.Types.Assoc
    ( Assoc (..)
    ) where

import           Control.Applicative       ((<$>))
import           Control.DeepSeq           (NFData)
import           Data.Typeable             (Typeable)
import           Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)

-- not defined for general Functor for performance reason.
-- (ie. you would want to write custom instances for each type using
-- specialized mapM-like functions)
newtype Assoc a
    = Assoc { unAssoc :: a }
    deriving (Show, Read, Eq, Ord, Typeable, NFData)

instance Arbitrary a => Arbitrary (Assoc a) where
    arbitrary = Assoc <$> arbitrary