{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Morpheus.Ext.SafeHashMap ( SafeHashMap, unsafeFromList, insert, ) where import qualified Data.HashMap.Lazy as HM import Data.Morpheus.Error.NameCollision (NameCollision (..)) import Data.Morpheus.Ext.Elems (Elems) import Data.Morpheus.Ext.Empty (Empty) import Data.Morpheus.Ext.SemigroupM ( (<:>), SemigroupM (..), ) import Data.Morpheus.Internal.Utils ( Collection (..), Failure (..), FromElems (..), KeyOf (..), Selectable (..), ) import Data.Morpheus.Types.Internal.AST.Base (ValidationErrors) import Language.Haskell.TH.Syntax (Lift (..)) import Relude newtype SafeHashMap k a = SafeHashMap { SafeHashMap k a -> HashMap k a unpackSafeHashMap :: HashMap k a } deriving ( Int -> SafeHashMap k a -> ShowS [SafeHashMap k a] -> ShowS SafeHashMap k a -> String (Int -> SafeHashMap k a -> ShowS) -> (SafeHashMap k a -> String) -> ([SafeHashMap k a] -> ShowS) -> Show (SafeHashMap k a) forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a forall k a. (Show k, Show a) => Int -> SafeHashMap k a -> ShowS forall k a. (Show k, Show a) => [SafeHashMap k a] -> ShowS forall k a. (Show k, Show a) => SafeHashMap k a -> String showList :: [SafeHashMap k a] -> ShowS $cshowList :: forall k a. (Show k, Show a) => [SafeHashMap k a] -> ShowS show :: SafeHashMap k a -> String $cshow :: forall k a. (Show k, Show a) => SafeHashMap k a -> String showsPrec :: Int -> SafeHashMap k a -> ShowS $cshowsPrec :: forall k a. (Show k, Show a) => Int -> SafeHashMap k a -> ShowS Show, SafeHashMap k a -> SafeHashMap k a -> Bool (SafeHashMap k a -> SafeHashMap k a -> Bool) -> (SafeHashMap k a -> SafeHashMap k a -> Bool) -> Eq (SafeHashMap k a) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall k a. (Eq k, Eq a) => SafeHashMap k a -> SafeHashMap k a -> Bool /= :: SafeHashMap k a -> SafeHashMap k a -> Bool $c/= :: forall k a. (Eq k, Eq a) => SafeHashMap k a -> SafeHashMap k a -> Bool == :: SafeHashMap k a -> SafeHashMap k a -> Bool $c== :: forall k a. (Eq k, Eq a) => SafeHashMap k a -> SafeHashMap k a -> Bool Eq, a -> SafeHashMap k b -> SafeHashMap k a (a -> b) -> SafeHashMap k a -> SafeHashMap k b (forall a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b) -> (forall a b. a -> SafeHashMap k b -> SafeHashMap k a) -> Functor (SafeHashMap k) forall a b. a -> SafeHashMap k b -> SafeHashMap k a forall a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b forall k a b. a -> SafeHashMap k b -> SafeHashMap k a forall k a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> SafeHashMap k b -> SafeHashMap k a $c<$ :: forall k a b. a -> SafeHashMap k b -> SafeHashMap k a fmap :: (a -> b) -> SafeHashMap k a -> SafeHashMap k b $cfmap :: forall k a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b Functor, a -> SafeHashMap k a -> Bool SafeHashMap k m -> m SafeHashMap k a -> [a] SafeHashMap k a -> Bool SafeHashMap k a -> Int SafeHashMap k a -> a SafeHashMap k a -> a SafeHashMap k a -> a SafeHashMap k a -> a (a -> m) -> SafeHashMap k a -> m (a -> m) -> SafeHashMap k a -> m (a -> b -> b) -> b -> SafeHashMap k a -> b (a -> b -> b) -> b -> SafeHashMap k a -> b (b -> a -> b) -> b -> SafeHashMap k a -> b (b -> a -> b) -> b -> SafeHashMap k a -> b (a -> a -> a) -> SafeHashMap k a -> a (a -> a -> a) -> SafeHashMap k a -> a (forall m. Monoid m => SafeHashMap k m -> m) -> (forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> m) -> (forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> m) -> (forall a b. (a -> b -> b) -> b -> SafeHashMap k a -> b) -> (forall a b. (a -> b -> b) -> b -> SafeHashMap k a -> b) -> (forall b a. (b -> a -> b) -> b -> SafeHashMap k a -> b) -> (forall b a. (b -> a -> b) -> b -> SafeHashMap k a -> b) -> (forall a. (a -> a -> a) -> SafeHashMap k a -> a) -> (forall a. (a -> a -> a) -> SafeHashMap k a -> a) -> (forall a. SafeHashMap k a -> [a]) -> (forall a. SafeHashMap k a -> Bool) -> (forall a. SafeHashMap k a -> Int) -> (forall a. Eq a => a -> SafeHashMap k a -> Bool) -> (forall a. Ord a => SafeHashMap k a -> a) -> (forall a. Ord a => SafeHashMap k a -> a) -> (forall a. Num a => SafeHashMap k a -> a) -> (forall a. Num a => SafeHashMap k a -> a) -> Foldable (SafeHashMap k) forall a. Eq a => a -> SafeHashMap k a -> Bool forall a. Num a => SafeHashMap k a -> a forall a. Ord a => SafeHashMap k a -> a forall m. Monoid m => SafeHashMap k m -> m forall a. SafeHashMap k a -> Bool forall a. SafeHashMap k a -> Int forall a. SafeHashMap k a -> [a] forall a. (a -> a -> a) -> SafeHashMap k a -> a forall k a. Eq a => a -> SafeHashMap k a -> Bool forall k a. Num a => SafeHashMap k a -> a forall k a. Ord a => SafeHashMap k a -> a forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> m forall k m. Monoid m => SafeHashMap k m -> m forall k a. SafeHashMap k a -> Bool forall k a. SafeHashMap k a -> Int forall k a. SafeHashMap k a -> [a] forall b a. (b -> a -> b) -> b -> SafeHashMap k a -> b forall a b. (a -> b -> b) -> b -> SafeHashMap k a -> b forall k a. (a -> a -> a) -> SafeHashMap k a -> a forall k m a. Monoid m => (a -> m) -> SafeHashMap k a -> m forall k b a. (b -> a -> b) -> b -> SafeHashMap k a -> b forall k a b. (a -> b -> b) -> b -> SafeHashMap k a -> b forall (t :: * -> *). (forall m. Monoid m => t m -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. t a -> [a]) -> (forall a. t a -> Bool) -> (forall a. t a -> Int) -> (forall a. Eq a => a -> t a -> Bool) -> (forall a. Ord a => t a -> a) -> (forall a. Ord a => t a -> a) -> (forall a. Num a => t a -> a) -> (forall a. Num a => t a -> a) -> Foldable t product :: SafeHashMap k a -> a $cproduct :: forall k a. Num a => SafeHashMap k a -> a sum :: SafeHashMap k a -> a $csum :: forall k a. Num a => SafeHashMap k a -> a minimum :: SafeHashMap k a -> a $cminimum :: forall k a. Ord a => SafeHashMap k a -> a maximum :: SafeHashMap k a -> a $cmaximum :: forall k a. Ord a => SafeHashMap k a -> a elem :: a -> SafeHashMap k a -> Bool $celem :: forall k a. Eq a => a -> SafeHashMap k a -> Bool length :: SafeHashMap k a -> Int $clength :: forall k a. SafeHashMap k a -> Int null :: SafeHashMap k a -> Bool $cnull :: forall k a. SafeHashMap k a -> Bool toList :: SafeHashMap k a -> [a] $ctoList :: forall k a. SafeHashMap k a -> [a] foldl1 :: (a -> a -> a) -> SafeHashMap k a -> a $cfoldl1 :: forall k a. (a -> a -> a) -> SafeHashMap k a -> a foldr1 :: (a -> a -> a) -> SafeHashMap k a -> a $cfoldr1 :: forall k a. (a -> a -> a) -> SafeHashMap k a -> a foldl' :: (b -> a -> b) -> b -> SafeHashMap k a -> b $cfoldl' :: forall k b a. (b -> a -> b) -> b -> SafeHashMap k a -> b foldl :: (b -> a -> b) -> b -> SafeHashMap k a -> b $cfoldl :: forall k b a. (b -> a -> b) -> b -> SafeHashMap k a -> b foldr' :: (a -> b -> b) -> b -> SafeHashMap k a -> b $cfoldr' :: forall k a b. (a -> b -> b) -> b -> SafeHashMap k a -> b foldr :: (a -> b -> b) -> b -> SafeHashMap k a -> b $cfoldr :: forall k a b. (a -> b -> b) -> b -> SafeHashMap k a -> b foldMap' :: (a -> m) -> SafeHashMap k a -> m $cfoldMap' :: forall k m a. Monoid m => (a -> m) -> SafeHashMap k a -> m foldMap :: (a -> m) -> SafeHashMap k a -> m $cfoldMap :: forall k m a. Monoid m => (a -> m) -> SafeHashMap k a -> m fold :: SafeHashMap k m -> m $cfold :: forall k m. Monoid m => SafeHashMap k m -> m Foldable, Functor (SafeHashMap k) Foldable (SafeHashMap k) Functor (SafeHashMap k) -> Foldable (SafeHashMap k) -> (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b)) -> (forall (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> SafeHashMap k a -> m (SafeHashMap k b)) -> (forall (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a)) -> Traversable (SafeHashMap k) (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) forall k. Functor (SafeHashMap k) forall k. Foldable (SafeHashMap k) forall k (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a) forall k (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a) forall k (m :: * -> *) a b. Monad m => (a -> m b) -> SafeHashMap k a -> m (SafeHashMap k b) forall k (f :: * -> *) a b. Applicative f => (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) forall (t :: * -> *). Functor t -> Foldable t -> (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> t a -> f (t b)) -> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> t a -> m (t b)) -> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a)) -> Traversable t forall (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a) forall (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> SafeHashMap k a -> m (SafeHashMap k b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) sequence :: SafeHashMap k (m a) -> m (SafeHashMap k a) $csequence :: forall k (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a) mapM :: (a -> m b) -> SafeHashMap k a -> m (SafeHashMap k b) $cmapM :: forall k (m :: * -> *) a b. Monad m => (a -> m b) -> SafeHashMap k a -> m (SafeHashMap k b) sequenceA :: SafeHashMap k (f a) -> f (SafeHashMap k a) $csequenceA :: forall k (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a) traverse :: (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) $ctraverse :: forall k (f :: * -> *) a b. Applicative f => (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) $cp2Traversable :: forall k. Foldable (SafeHashMap k) $cp1Traversable :: forall k. Functor (SafeHashMap k) Traversable ) deriving newtype ( Collection a, Selectable k a, Elems a, SafeHashMap k a SafeHashMap k a -> Empty (SafeHashMap k a) forall coll. coll -> Empty coll forall k a. SafeHashMap k a empty :: SafeHashMap k a $cempty :: forall k a. SafeHashMap k a Empty ) instance (Lift a, Lift k, Eq k, Hashable k) => Lift (SafeHashMap k a) where lift :: SafeHashMap k a -> Q Exp lift (SafeHashMap HashMap k a x) = let ls :: [(k, a)] ls = HashMap k a -> [(k, a)] forall k v. HashMap k v -> [(k, v)] HM.toList HashMap k a x in [|SafeHashMap (HM.fromList ls)|] #if MIN_VERSION_template_haskell(2,16,0) liftTyped :: SafeHashMap k a -> Q (TExp (SafeHashMap k a)) liftTyped (SafeHashMap HashMap k a x) = let ls :: [(k, a)] ls = HashMap k a -> [(k, a)] forall k v. HashMap k v -> [(k, v)] HM.toList HashMap k a x in [||SafeHashMap (HM.fromList ls)||] #endif instance (NameCollision a, Monad m, KeyOf k a, Failure ValidationErrors m) => SemigroupM m (SafeHashMap k a) where mergeM :: [Ref FieldName] -> SafeHashMap k a -> SafeHashMap k a -> m (SafeHashMap k a) mergeM [Ref FieldName] ref (SafeHashMap HashMap k a x) (SafeHashMap HashMap k a y) = HashMap k a -> SafeHashMap k a forall k a. HashMap k a -> SafeHashMap k a SafeHashMap (HashMap k a -> SafeHashMap k a) -> m (HashMap k a) -> m (SafeHashMap k a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Ref FieldName] -> HashMap k a -> HashMap k a -> m (HashMap k a) forall (m :: * -> *) a. SemigroupM m a => [Ref FieldName] -> a -> a -> m a mergeM [Ref FieldName] ref HashMap k a x HashMap k a y instance (NameCollision a, Failure ValidationErrors m, Monad m, KeyOf k a, Hashable k) => FromElems m a (SafeHashMap k a) where fromElems :: [a] -> m (SafeHashMap k a) fromElems = (HashMap k a -> SafeHashMap k a) -> m (HashMap k a) -> m (SafeHashMap k a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap HashMap k a -> SafeHashMap k a forall k a. HashMap k a -> SafeHashMap k a SafeHashMap (m (HashMap k a) -> m (SafeHashMap k a)) -> ([a] -> m (HashMap k a)) -> [a] -> m (SafeHashMap k a) forall b c a. (b -> c) -> (a -> b) -> a -> c . [a] -> m (HashMap k a) forall k (m :: k -> *) a (coll :: k). FromElems m a coll => [a] -> m coll fromElems unsafeFromList :: (Eq k, Hashable k) => [(k, a)] -> SafeHashMap k a unsafeFromList :: [(k, a)] -> SafeHashMap k a unsafeFromList = HashMap k a -> SafeHashMap k a forall k a. HashMap k a -> SafeHashMap k a SafeHashMap (HashMap k a -> SafeHashMap k a) -> ([(k, a)] -> HashMap k a) -> [(k, a)] -> SafeHashMap k a forall b c a. (b -> c) -> (a -> b) -> a -> c . [(k, a)] -> HashMap k a forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v HM.fromList insert :: ( NameCollision a, KeyOf k a, Monad m, Failure ValidationErrors m ) => a -> SafeHashMap k a -> m (SafeHashMap k a) insert :: a -> SafeHashMap k a -> m (SafeHashMap k a) insert a x = (SafeHashMap k a -> SafeHashMap k a -> m (SafeHashMap k a) forall (m :: * -> *) a. SemigroupM m a => a -> a -> m a <:> a -> SafeHashMap k a forall a coll. Collection a coll => a -> coll singleton a x)