{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskellQuotes #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Mergeable.SafeHashMap ( SafeHashMap, toHashMap, ) where import Control.Monad.Except (MonadError) import qualified Data.HashMap.Lazy as HM import Data.Mergeable ( Merge (..), NameCollision (..), ) import Data.Mergeable.IsMap (FromList (..), IsMap) import Data.Morpheus.Ext.Empty (Empty) import Language.Haskell.TH.Syntax (Lift (..)) import Relude hiding (fromList) newtype SafeHashMap k a = SafeHashMap { forall k a. SafeHashMap k a -> HashMap k a unpackSafeHashMap :: HashMap k a } deriving ( Int -> SafeHashMap k a -> ShowS 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 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, 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 <$ :: forall a b. a -> SafeHashMap k b -> SafeHashMap k a $c<$ :: forall k a b. a -> SafeHashMap k b -> SafeHashMap k a fmap :: forall a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b $cfmap :: forall k a b. (a -> b) -> SafeHashMap k a -> SafeHashMap k b Functor, 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 k m. Monoid m => SafeHashMap k m -> m forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> 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 :: forall a. Num a => SafeHashMap k a -> a $cproduct :: forall k a. Num a => SafeHashMap k a -> a sum :: forall a. Num a => SafeHashMap k a -> a $csum :: forall k a. Num a => SafeHashMap k a -> a minimum :: forall a. Ord a => SafeHashMap k a -> a $cminimum :: forall k a. Ord a => SafeHashMap k a -> a maximum :: forall a. Ord a => SafeHashMap k a -> a $cmaximum :: forall k a. Ord a => SafeHashMap k a -> a elem :: forall a. Eq a => a -> SafeHashMap k a -> Bool $celem :: forall k a. Eq a => a -> SafeHashMap k a -> Bool length :: forall a. SafeHashMap k a -> Int $clength :: forall k a. SafeHashMap k a -> Int null :: forall a. SafeHashMap k a -> Bool $cnull :: forall k a. SafeHashMap k a -> Bool toList :: forall a. SafeHashMap k a -> [a] $ctoList :: forall k a. SafeHashMap k a -> [a] foldl1 :: forall a. (a -> a -> a) -> SafeHashMap k a -> a $cfoldl1 :: forall k a. (a -> a -> a) -> SafeHashMap k a -> a foldr1 :: forall a. (a -> a -> a) -> SafeHashMap k a -> a $cfoldr1 :: forall k a. (a -> a -> a) -> SafeHashMap k a -> a foldl' :: forall b a. (b -> a -> b) -> b -> SafeHashMap k a -> b $cfoldl' :: forall k b a. (b -> a -> b) -> b -> SafeHashMap k a -> b foldl :: forall b a. (b -> a -> b) -> b -> SafeHashMap k a -> b $cfoldl :: forall k b a. (b -> a -> b) -> b -> SafeHashMap k a -> b foldr' :: forall a b. (a -> b -> b) -> b -> SafeHashMap k a -> b $cfoldr' :: forall k a b. (a -> b -> b) -> b -> SafeHashMap k a -> b foldr :: forall a b. (a -> b -> b) -> b -> SafeHashMap k a -> b $cfoldr :: forall k a b. (a -> b -> b) -> b -> SafeHashMap k a -> b foldMap' :: forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> m $cfoldMap' :: forall k m a. Monoid m => (a -> m) -> SafeHashMap k a -> m foldMap :: forall m a. Monoid m => (a -> m) -> SafeHashMap k a -> m $cfoldMap :: forall k m a. Monoid m => (a -> m) -> SafeHashMap k a -> m fold :: forall m. Monoid m => SafeHashMap k m -> m $cfold :: forall k m. Monoid m => SafeHashMap k m -> m Foldable, 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 (f :: * -> *) a b. Applicative f => (a -> f b) -> SafeHashMap k a -> f (SafeHashMap k b) sequence :: forall (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a) $csequence :: forall k (m :: * -> *) a. Monad m => SafeHashMap k (m a) -> m (SafeHashMap k a) mapM :: forall (m :: * -> *) a b. Monad m => (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 :: forall (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a) $csequenceA :: forall k (f :: * -> *) a. Applicative f => SafeHashMap k (f a) -> f (SafeHashMap k a) traverse :: forall (f :: * -> *) a b. Applicative f => (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) Traversable ) deriving newtype ( IsMap k, 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 ) toHashMap :: SafeHashMap k a -> HashMap k a toHashMap :: forall k a. SafeHashMap k a -> HashMap k a toHashMap = forall k a. SafeHashMap k a -> HashMap k a unpackSafeHashMap instance (Lift a, Lift k, Eq k, Hashable k) => Lift (SafeHashMap k a) where lift :: forall (m :: * -> *). Quote m => SafeHashMap k a -> m Exp lift (SafeHashMap HashMap k a x) = let ls :: [(k, a)] ls = 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 :: forall (m :: * -> *). Quote m => SafeHashMap k a -> Code m (SafeHashMap k a) liftTyped (SafeHashMap HashMap k a x) = let ls :: [(k, a)] ls = forall k v. HashMap k v -> [(k, v)] HM.toList HashMap k a x in [||SafeHashMap (HM.fromList ls)||] #endif instance (NameCollision e a, Monad m, Hashable k, Eq k, MonadError e m) => Merge m (SafeHashMap k a) where merge :: Monad m => SafeHashMap k a -> SafeHashMap k a -> m (SafeHashMap k a) merge (SafeHashMap HashMap k a x) (SafeHashMap HashMap k a y) = forall k a. HashMap k a -> SafeHashMap k a SafeHashMap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (m :: * -> *) a. (Merge m a, Monad m) => a -> a -> m a merge HashMap k a x HashMap k a y instance ( Hashable k, Eq k, NameCollision e a, MonadError e m ) => FromList m SafeHashMap k a where fromList :: Monad m => [(k, a)] -> m (SafeHashMap k a) fromList [(k, a)] xs = forall k a. HashMap k a -> SafeHashMap k a SafeHashMap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (m :: * -> *) (map :: * -> * -> *) k a. (FromList m map k a, Monad m) => [(k, a)] -> m (map k a) fromList [(k, a)] xs