    {-# LANGUAGE CPP #-}
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    {-# LANGUAGE ScopedTypeVariables #-}
    module Test.Hspec.Core.Annotations (
      Annotations
    , setValue
    , getValue
    ) where

    import           Prelude ()
    import           Test.Hspec.Core.Compat

    import           Data.Typeable
    import           Data.Dynamic
    import           Data.Map (Map)
    import qualified Data.Map as Map

    newtype Annotations = Annotations (Map TypeRep Dynamic)
      deriving (
    #if MIN_VERSION_base(4,11,0)
      NonEmpty Annotations -> Annotations
    Annotations -> Annotations -> Annotations
    (Annotations -> Annotations -> Annotations)
    -> (NonEmpty Annotations -> Annotations)
    -> (forall b. Integral b => b -> Annotations -> Annotations)
    -> Semigroup Annotations
    forall b. Integral b => b -> Annotations -> Annotations
    forall a.
    (a -> a -> a)
    -> (NonEmpty a -> a)
    -> (forall b. Integral b => b -> a -> a)
    -> Semigroup a
    $c<> :: Annotations -> Annotations -> Annotations
    <> :: Annotations -> Annotations -> Annotations
    $csconcat :: NonEmpty Annotations -> Annotations
    sconcat :: NonEmpty Annotations -> Annotations
    $cstimes :: forall b. Integral b => b -> Annotations -> Annotations
    stimes :: forall b. Integral b => b -> Annotations -> Annotations
    Semigroup,
    #endif
      Semigroup Annotations
    Annotations
    Semigroup Annotations =>
    Annotations
    -> (Annotations -> Annotations -> Annotations)
    -> ([Annotations] -> Annotations)
    -> Monoid Annotations
    [Annotations] -> Annotations
    Annotations -> Annotations -> Annotations
    forall a.
    Semigroup a =>
    a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
    $cmempty :: Annotations
    mempty :: Annotations
    $cmappend :: Annotations -> Annotations -> Annotations
    mappend :: Annotations -> Annotations -> Annotations
    $cmconcat :: [Annotations] -> Annotations
    mconcat :: [Annotations] -> Annotations
    Monoid)

    setValue :: Typeable value => value -> Annotations -> Annotations
    setValue :: forall value. Typeable value => value -> Annotations -> Annotations
    setValue value
    value (Annotations Map TypeRep Dynamic
    values) = Map TypeRep Dynamic -> Annotations
    Annotations (Map TypeRep Dynamic -> Annotations)
    -> Map TypeRep Dynamic -> Annotations
    forall a b. (a -> b) -> a -> b
    $ TypeRep -> Dynamic -> Map TypeRep Dynamic -> Map TypeRep Dynamic
    forall k a. Ord k => k -> a -> Map k a -> Map k a
    Map.insert (value -> TypeRep
    forall a. Typeable a => a -> TypeRep
    typeOf value
    value) (value -> Dynamic
    forall a. Typeable a => a -> Dynamic
    toDyn value
    value) Map TypeRep Dynamic
    values

    getValue :: forall value. Typeable value => Annotations -> Maybe value
    getValue :: forall value. Typeable value => Annotations -> Maybe value
    getValue (Annotations Map TypeRep Dynamic
    values) = TypeRep -> Map TypeRep Dynamic -> Maybe Dynamic
    forall k a. Ord k => k -> Map k a -> Maybe a
    Map.lookup (value -> TypeRep
    forall a. Typeable a => a -> TypeRep
    typeOf (value
    forall a. HasCallStack => a
    undefined :: value)) Map TypeRep Dynamic
    values Maybe Dynamic -> (Dynamic -> Maybe value) -> Maybe value
    forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
    forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
    >>= Dynamic -> Maybe value
    forall a. Typeable a => Dynamic -> Maybe a
    fromDynamic