{-# LANGUAGE DeriveLift #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE NoImplicitPrelude #-} module Data.Mergeable.Internal.Resolution ( Indexed (..), indexed, fromListT, resolveWith, runResolutionT, ResolutionT, ) where import qualified Data.HashMap.Lazy as HM import Language.Haskell.TH.Syntax (Lift) import Relude sortedEntries :: [Indexed k a] -> [(k, a)] sortedEntries :: [Indexed k a] -> [(k, a)] sortedEntries = (Indexed k a -> (k, a)) -> [Indexed k a] -> [(k, a)] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap Indexed k a -> (k, a) forall k b. Indexed k b -> (k, b) f ([Indexed k a] -> [(k, a)]) -> ([Indexed k a] -> [Indexed k a]) -> [Indexed k a] -> [(k, a)] forall b c a. (b -> c) -> (a -> b) -> a -> c . (Indexed k a -> Int) -> [Indexed k a] -> [Indexed k a] forall b a. Ord b => (a -> b) -> [a] -> [a] sortOn Indexed k a -> Int forall k a. Indexed k a -> Int index where f :: Indexed k b -> (k, b) f Indexed k b a = (Indexed k b -> k forall k a. Indexed k a -> k indexedKey Indexed k b a, Indexed k b -> b forall k a. Indexed k a -> a indexedValue Indexed k b a) fromListT :: (Monad m, Eq k, Hashable k) => [(k, a)] -> ResolutionT k a coll m coll fromListT :: [(k, a)] -> ResolutionT k a coll m coll fromListT = ((k, NonEmpty a) -> ResolutionT k a coll m (k, a)) -> [(k, NonEmpty a)] -> ResolutionT k a coll m [(k, a)] forall (t :: * -> *) (f :: * -> *) a b. (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) traverse (k, NonEmpty a) -> ResolutionT k a coll m (k, a) forall (m :: * -> *) k a coll. Monad m => (k, NonEmpty a) -> ResolutionT k a coll m (k, a) resolveDuplicatesM ([(k, NonEmpty a)] -> ResolutionT k a coll m [(k, a)]) -> ([(k, a)] -> [(k, NonEmpty a)]) -> [(k, a)] -> ResolutionT k a coll m [(k, a)] forall b c a. (b -> c) -> (a -> b) -> a -> c . [(k, a)] -> [(k, NonEmpty a)] forall k a. (Eq k, Hashable k) => [(k, a)] -> [(k, NonEmpty a)] fromListDuplicates ([(k, a)] -> ResolutionT k a coll m [(k, a)]) -> ([(k, a)] -> ResolutionT k a coll m coll) -> [(k, a)] -> ResolutionT k a coll m coll forall (m :: * -> *) a b c. Monad m => (a -> m b) -> (b -> m c) -> a -> m c >=> [(k, a)] -> ResolutionT k a coll m coll forall (m :: * -> *) k a coll. Monad m => [(k, a)] -> ResolutionT k a coll m coll fromNoDuplicatesM resolveWith :: Monad m => (a -> a -> m a) -> NonEmpty a -> m a resolveWith :: (a -> a -> m a) -> NonEmpty a -> m a resolveWith a -> a -> m a f (a x :| [a] xs) = (a -> a -> m a) -> a -> [a] -> m a forall (t :: * -> *) (m :: * -> *) b a. (Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b foldlM a -> a -> m a f a x [a] xs data Indexed k a = Indexed { Indexed k a -> Int index :: Int, Indexed k a -> k indexedKey :: k, Indexed k a -> a indexedValue :: a } deriving ( Int -> Indexed k a -> ShowS [Indexed k a] -> ShowS Indexed k a -> String (Int -> Indexed k a -> ShowS) -> (Indexed k a -> String) -> ([Indexed k a] -> ShowS) -> Show (Indexed k a) forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a forall k a. (Show k, Show a) => Int -> Indexed k a -> ShowS forall k a. (Show k, Show a) => [Indexed k a] -> ShowS forall k a. (Show k, Show a) => Indexed k a -> String showList :: [Indexed k a] -> ShowS $cshowList :: forall k a. (Show k, Show a) => [Indexed k a] -> ShowS show :: Indexed k a -> String $cshow :: forall k a. (Show k, Show a) => Indexed k a -> String showsPrec :: Int -> Indexed k a -> ShowS $cshowsPrec :: forall k a. (Show k, Show a) => Int -> Indexed k a -> ShowS Show, Indexed k a -> Indexed k a -> Bool (Indexed k a -> Indexed k a -> Bool) -> (Indexed k a -> Indexed k a -> Bool) -> Eq (Indexed k a) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall k a. (Eq k, Eq a) => Indexed k a -> Indexed k a -> Bool /= :: Indexed k a -> Indexed k a -> Bool $c/= :: forall k a. (Eq k, Eq a) => Indexed k a -> Indexed k a -> Bool == :: Indexed k a -> Indexed k a -> Bool $c== :: forall k a. (Eq k, Eq a) => Indexed k a -> Indexed k a -> Bool Eq, a -> Indexed k b -> Indexed k a (a -> b) -> Indexed k a -> Indexed k b (forall a b. (a -> b) -> Indexed k a -> Indexed k b) -> (forall a b. a -> Indexed k b -> Indexed k a) -> Functor (Indexed k) forall a b. a -> Indexed k b -> Indexed k a forall a b. (a -> b) -> Indexed k a -> Indexed k b forall k a b. a -> Indexed k b -> Indexed k a forall k a b. (a -> b) -> Indexed k a -> Indexed k b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> Indexed k b -> Indexed k a $c<$ :: forall k a b. a -> Indexed k b -> Indexed k a fmap :: (a -> b) -> Indexed k a -> Indexed k b $cfmap :: forall k a b. (a -> b) -> Indexed k a -> Indexed k b Functor, Functor (Indexed k) Foldable (Indexed k) Functor (Indexed k) -> Foldable (Indexed k) -> (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Indexed k a -> f (Indexed k b)) -> (forall (f :: * -> *) a. Applicative f => Indexed k (f a) -> f (Indexed k a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> Indexed k a -> m (Indexed k b)) -> (forall (m :: * -> *) a. Monad m => Indexed k (m a) -> m (Indexed k a)) -> Traversable (Indexed k) (a -> f b) -> Indexed k a -> f (Indexed k b) forall k. Functor (Indexed k) forall k. Foldable (Indexed k) forall k (m :: * -> *) a. Monad m => Indexed k (m a) -> m (Indexed k a) forall k (f :: * -> *) a. Applicative f => Indexed k (f a) -> f (Indexed k a) forall k (m :: * -> *) a b. Monad m => (a -> m b) -> Indexed k a -> m (Indexed k b) forall k (f :: * -> *) a b. Applicative f => (a -> f b) -> Indexed k a -> f (Indexed 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 => Indexed k (m a) -> m (Indexed k a) forall (f :: * -> *) a. Applicative f => Indexed k (f a) -> f (Indexed k a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> Indexed k a -> m (Indexed k b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Indexed k a -> f (Indexed k b) sequence :: Indexed k (m a) -> m (Indexed k a) $csequence :: forall k (m :: * -> *) a. Monad m => Indexed k (m a) -> m (Indexed k a) mapM :: (a -> m b) -> Indexed k a -> m (Indexed k b) $cmapM :: forall k (m :: * -> *) a b. Monad m => (a -> m b) -> Indexed k a -> m (Indexed k b) sequenceA :: Indexed k (f a) -> f (Indexed k a) $csequenceA :: forall k (f :: * -> *) a. Applicative f => Indexed k (f a) -> f (Indexed k a) traverse :: (a -> f b) -> Indexed k a -> f (Indexed k b) $ctraverse :: forall k (f :: * -> *) a b. Applicative f => (a -> f b) -> Indexed k a -> f (Indexed k b) $cp2Traversable :: forall k. Foldable (Indexed k) $cp1Traversable :: forall k. Functor (Indexed k) Traversable, Indexed k a -> Bool (a -> m) -> Indexed k a -> m (a -> b -> b) -> b -> Indexed k a -> b (forall m. Monoid m => Indexed k m -> m) -> (forall m a. Monoid m => (a -> m) -> Indexed k a -> m) -> (forall m a. Monoid m => (a -> m) -> Indexed k a -> m) -> (forall a b. (a -> b -> b) -> b -> Indexed k a -> b) -> (forall a b. (a -> b -> b) -> b -> Indexed k a -> b) -> (forall b a. (b -> a -> b) -> b -> Indexed k a -> b) -> (forall b a. (b -> a -> b) -> b -> Indexed k a -> b) -> (forall a. (a -> a -> a) -> Indexed k a -> a) -> (forall a. (a -> a -> a) -> Indexed k a -> a) -> (forall a. Indexed k a -> [a]) -> (forall a. Indexed k a -> Bool) -> (forall a. Indexed k a -> Int) -> (forall a. Eq a => a -> Indexed k a -> Bool) -> (forall a. Ord a => Indexed k a -> a) -> (forall a. Ord a => Indexed k a -> a) -> (forall a. Num a => Indexed k a -> a) -> (forall a. Num a => Indexed k a -> a) -> Foldable (Indexed k) forall a. Eq a => a -> Indexed k a -> Bool forall a. Num a => Indexed k a -> a forall a. Ord a => Indexed k a -> a forall m. Monoid m => Indexed k m -> m forall a. Indexed k a -> Bool forall a. Indexed k a -> Int forall a. Indexed k a -> [a] forall a. (a -> a -> a) -> Indexed k a -> a forall k a. Eq a => a -> Indexed k a -> Bool forall k a. Num a => Indexed k a -> a forall k a. Ord a => Indexed k a -> a forall m a. Monoid m => (a -> m) -> Indexed k a -> m forall k m. Monoid m => Indexed k m -> m forall k a. Indexed k a -> Bool forall k a. Indexed k a -> Int forall k a. Indexed k a -> [a] forall b a. (b -> a -> b) -> b -> Indexed k a -> b forall a b. (a -> b -> b) -> b -> Indexed k a -> b forall k a. (a -> a -> a) -> Indexed k a -> a forall k m a. Monoid m => (a -> m) -> Indexed k a -> m forall k b a. (b -> a -> b) -> b -> Indexed k a -> b forall k a b. (a -> b -> b) -> b -> Indexed 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 :: Indexed k a -> a $cproduct :: forall k a. Num a => Indexed k a -> a sum :: Indexed k a -> a $csum :: forall k a. Num a => Indexed k a -> a minimum :: Indexed k a -> a $cminimum :: forall k a. Ord a => Indexed k a -> a maximum :: Indexed k a -> a $cmaximum :: forall k a. Ord a => Indexed k a -> a elem :: a -> Indexed k a -> Bool $celem :: forall k a. Eq a => a -> Indexed k a -> Bool length :: Indexed k a -> Int $clength :: forall k a. Indexed k a -> Int null :: Indexed k a -> Bool $cnull :: forall k a. Indexed k a -> Bool toList :: Indexed k a -> [a] $ctoList :: forall k a. Indexed k a -> [a] foldl1 :: (a -> a -> a) -> Indexed k a -> a $cfoldl1 :: forall k a. (a -> a -> a) -> Indexed k a -> a foldr1 :: (a -> a -> a) -> Indexed k a -> a $cfoldr1 :: forall k a. (a -> a -> a) -> Indexed k a -> a foldl' :: (b -> a -> b) -> b -> Indexed k a -> b $cfoldl' :: forall k b a. (b -> a -> b) -> b -> Indexed k a -> b foldl :: (b -> a -> b) -> b -> Indexed k a -> b $cfoldl :: forall k b a. (b -> a -> b) -> b -> Indexed k a -> b foldr' :: (a -> b -> b) -> b -> Indexed k a -> b $cfoldr' :: forall k a b. (a -> b -> b) -> b -> Indexed k a -> b foldr :: (a -> b -> b) -> b -> Indexed k a -> b $cfoldr :: forall k a b. (a -> b -> b) -> b -> Indexed k a -> b foldMap' :: (a -> m) -> Indexed k a -> m $cfoldMap' :: forall k m a. Monoid m => (a -> m) -> Indexed k a -> m foldMap :: (a -> m) -> Indexed k a -> m $cfoldMap :: forall k m a. Monoid m => (a -> m) -> Indexed k a -> m fold :: Indexed k m -> m $cfold :: forall k m. Monoid m => Indexed k m -> m Foldable, Indexed k a -> Q Exp Indexed k a -> Q (TExp (Indexed k a)) (Indexed k a -> Q Exp) -> (Indexed k a -> Q (TExp (Indexed k a))) -> Lift (Indexed k a) forall k a. (Lift k, Lift a) => Indexed k a -> Q Exp forall k a. (Lift k, Lift a) => Indexed k a -> Q (TExp (Indexed k a)) forall t. (t -> Q Exp) -> (t -> Q (TExp t)) -> Lift t liftTyped :: Indexed k a -> Q (TExp (Indexed k a)) $cliftTyped :: forall k a. (Lift k, Lift a) => Indexed k a -> Q (TExp (Indexed k a)) lift :: Indexed k a -> Q Exp $clift :: forall k a. (Lift k, Lift a) => Indexed k a -> Q Exp Lift ) fromListDuplicates :: (Eq k, Hashable k) => [(k, a)] -> [(k, NonEmpty a)] fromListDuplicates :: [(k, a)] -> [(k, NonEmpty a)] fromListDuplicates [(k, a)] xs = [Indexed k (NonEmpty a)] -> [(k, NonEmpty a)] forall k a. [Indexed k a] -> [(k, a)] sortedEntries ([Indexed k (NonEmpty a)] -> [(k, NonEmpty a)]) -> [Indexed k (NonEmpty a)] -> [(k, NonEmpty a)] forall a b. (a -> b) -> a -> b $ HashMap k (Indexed k (NonEmpty a)) -> [Indexed k (NonEmpty a)] forall k v. HashMap k v -> [v] HM.elems (HashMap k (Indexed k (NonEmpty a)) -> [Indexed k (NonEmpty a)]) -> HashMap k (Indexed k (NonEmpty a)) -> [Indexed k (NonEmpty a)] forall a b. (a -> b) -> a -> b $ [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) forall k a. (Eq k, Hashable k) => [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) clusterDuplicates ([(k, a)] -> [Indexed k a] forall k a. [(k, a)] -> [Indexed k a] indexed [(k, a)] xs) HashMap k (Indexed k (NonEmpty a)) forall k v. HashMap k v HM.empty indexed :: [(k, a)] -> [Indexed k a] indexed :: [(k, a)] -> [Indexed k a] indexed = Int -> [(k, a)] -> [Indexed k a] forall k a. Int -> [(k, a)] -> [Indexed k a] __indexed Int 0 where __indexed :: Int -> [(k, a)] -> [Indexed k a] __indexed :: Int -> [(k, a)] -> [Indexed k a] __indexed Int _ [] = [] __indexed Int i ((k k, a x) : [(k, a)] xs) = Int -> k -> a -> Indexed k a forall k a. Int -> k -> a -> Indexed k a Indexed Int i k k a x Indexed k a -> [Indexed k a] -> [Indexed k a] forall a. a -> [a] -> [a] : Int -> [(k, a)] -> [Indexed k a] forall k a. Int -> [(k, a)] -> [Indexed k a] __indexed (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) [(k, a)] xs resolveDuplicatesM :: Monad m => (k, NonEmpty a) -> ResolutionT k a coll m (k, a) resolveDuplicatesM :: (k, NonEmpty a) -> ResolutionT k a coll m (k, a) resolveDuplicatesM (k k, NonEmpty a xs) = (Resolution k a coll m -> NonEmpty a -> m a) -> ResolutionT k a coll m (NonEmpty a -> m a) forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks Resolution k a coll m -> NonEmpty a -> m a forall k a coll (m :: * -> *). Resolution k a coll m -> NonEmpty a -> m a resolveDuplicates ResolutionT k a coll m (NonEmpty a -> m a) -> ((NonEmpty a -> m a) -> ResolutionT k a coll m (k, a)) -> ResolutionT k a coll m (k, a) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= m (k, a) -> ResolutionT k a coll m (k, a) forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (m (k, a) -> ResolutionT k a coll m (k, a)) -> ((NonEmpty a -> m a) -> m (k, a)) -> (NonEmpty a -> m a) -> ResolutionT k a coll m (k, a) forall b c a. (b -> c) -> (a -> b) -> a -> c . (a -> (k, a)) -> m a -> m (k, a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (k k,) (m a -> m (k, a)) -> ((NonEmpty a -> m a) -> m a) -> (NonEmpty a -> m a) -> m (k, a) forall b c a. (b -> c) -> (a -> b) -> a -> c . (NonEmpty a xs NonEmpty a -> (NonEmpty a -> m a) -> m a forall a b. a -> (a -> b) -> b &) fromNoDuplicatesM :: Monad m => [(k, a)] -> ResolutionT k a coll m coll fromNoDuplicatesM :: [(k, a)] -> ResolutionT k a coll m coll fromNoDuplicatesM [(k, a)] xs = (Resolution k a coll m -> coll) -> ResolutionT k a coll m coll forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks (([(k, a)] xs [(k, a)] -> ([(k, a)] -> coll) -> coll forall a b. a -> (a -> b) -> b &) (([(k, a)] -> coll) -> coll) -> (Resolution k a coll m -> [(k, a)] -> coll) -> Resolution k a coll m -> coll forall b c a. (b -> c) -> (a -> b) -> a -> c . Resolution k a coll m -> [(k, a)] -> coll forall k a coll (m :: * -> *). Resolution k a coll m -> [(k, a)] -> coll fromNoDuplicates) insertWithList :: (Eq k, Hashable k) => Indexed k (NonEmpty a) -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) insertWithList :: Indexed k (NonEmpty a) -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) insertWithList (Indexed Int i1 k key NonEmpty a value) = (Maybe (Indexed k (NonEmpty a)) -> Maybe (Indexed k (NonEmpty a))) -> k -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) forall k v. (Eq k, Hashable k) => (Maybe v -> Maybe v) -> k -> HashMap k v -> HashMap k v HM.alter (Indexed k (NonEmpty a) -> Maybe (Indexed k (NonEmpty a)) forall a. a -> Maybe a Just (Indexed k (NonEmpty a) -> Maybe (Indexed k (NonEmpty a))) -> (Maybe (Indexed k (NonEmpty a)) -> Indexed k (NonEmpty a)) -> Maybe (Indexed k (NonEmpty a)) -> Maybe (Indexed k (NonEmpty a)) forall b c a. (b -> c) -> (a -> b) -> a -> c . Maybe (Indexed k (NonEmpty a)) -> Indexed k (NonEmpty a) forall k. Maybe (Indexed k (NonEmpty a)) -> Indexed k (NonEmpty a) updater) k key where updater :: Maybe (Indexed k (NonEmpty a)) -> Indexed k (NonEmpty a) updater Maybe (Indexed k (NonEmpty a)) Nothing = Int -> k -> NonEmpty a -> Indexed k (NonEmpty a) forall k a. Int -> k -> a -> Indexed k a Indexed Int i1 k key NonEmpty a value updater (Just (Indexed Int i2 k _ NonEmpty a x)) = Int -> k -> NonEmpty a -> Indexed k (NonEmpty a) forall k a. Int -> k -> a -> Indexed k a Indexed Int i2 k key (NonEmpty a x NonEmpty a -> NonEmpty a -> NonEmpty a forall a. Semigroup a => a -> a -> a <> NonEmpty a value) clusterDuplicates :: (Eq k, Hashable k) => [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) clusterDuplicates :: [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) clusterDuplicates [] = HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) forall a. a -> a id clusterDuplicates [Indexed k a] xs = (HashMap k (Indexed k (NonEmpty a)) -> [Indexed k a] -> HashMap k (Indexed k (NonEmpty a))) -> [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) forall a b c. (a -> b -> c) -> b -> a -> c flip ((HashMap k (Indexed k (NonEmpty a)) -> Indexed k a -> HashMap k (Indexed k (NonEmpty a))) -> HashMap k (Indexed k (NonEmpty a)) -> [Indexed k a] -> HashMap k (Indexed k (NonEmpty a)) forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl' (\HashMap k (Indexed k (NonEmpty a)) coll Indexed k a x -> Indexed k (NonEmpty a) -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) forall k a. (Eq k, Hashable k) => Indexed k (NonEmpty a) -> HashMap k (Indexed k (NonEmpty a)) -> HashMap k (Indexed k (NonEmpty a)) insertWithList ((a -> NonEmpty a) -> Indexed k a -> Indexed k (NonEmpty a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :| []) Indexed k a x) HashMap k (Indexed k (NonEmpty a)) coll)) [Indexed k a] xs data Resolution k a coll m = Resolution { Resolution k a coll m -> NonEmpty a -> m a resolveDuplicates :: NonEmpty a -> m a, Resolution k a coll m -> [(k, a)] -> coll fromNoDuplicates :: [(k, a)] -> coll } runResolutionT :: ResolutionT k a coll m b -> ([(k, a)] -> coll) -> (NonEmpty a -> m a) -> m b runResolutionT :: ResolutionT k a coll m b -> ([(k, a)] -> coll) -> (NonEmpty a -> m a) -> m b runResolutionT (ResolutionT ReaderT (Resolution k a coll m) m b x) [(k, a)] -> coll fromNoDuplicates NonEmpty a -> m a resolveDuplicates = ReaderT (Resolution k a coll m) m b -> Resolution k a coll m -> m b forall r (m :: * -> *) a. ReaderT r m a -> r -> m a runReaderT ReaderT (Resolution k a coll m) m b x Resolution :: forall k a coll (m :: * -> *). (NonEmpty a -> m a) -> ([(k, a)] -> coll) -> Resolution k a coll m Resolution {[(k, a)] -> coll NonEmpty a -> m a resolveDuplicates :: NonEmpty a -> m a fromNoDuplicates :: [(k, a)] -> coll fromNoDuplicates :: [(k, a)] -> coll resolveDuplicates :: NonEmpty a -> m a ..} newtype ResolutionT k a coll m x = ResolutionT { ResolutionT k a coll m x -> ReaderT (Resolution k a coll m) m x _runResolutionT :: ReaderT (Resolution k a coll m) m x } deriving ( a -> ResolutionT k a coll m b -> ResolutionT k a coll m a (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b (forall a b. (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b) -> (forall a b. a -> ResolutionT k a coll m b -> ResolutionT k a coll m a) -> Functor (ResolutionT k a coll m) forall a b. a -> ResolutionT k a coll m b -> ResolutionT k a coll m a forall a b. (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b forall k a coll (m :: * -> *) a b. Functor m => a -> ResolutionT k a coll m b -> ResolutionT k a coll m a forall k a coll (m :: * -> *) a b. Functor m => (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> ResolutionT k a coll m b -> ResolutionT k a coll m a $c<$ :: forall k a coll (m :: * -> *) a b. Functor m => a -> ResolutionT k a coll m b -> ResolutionT k a coll m a fmap :: (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b $cfmap :: forall k a coll (m :: * -> *) a b. Functor m => (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b Functor, Applicative (ResolutionT k a coll m) a -> ResolutionT k a coll m a Applicative (ResolutionT k a coll m) -> (forall a b. ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b) -> (forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b) -> (forall a. a -> ResolutionT k a coll m a) -> Monad (ResolutionT k a coll m) ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b forall a. a -> ResolutionT k a coll m a forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b forall a b. ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b forall k a coll (m :: * -> *). Monad m => Applicative (ResolutionT k a coll m) forall k a coll (m :: * -> *) a. Monad m => a -> ResolutionT k a coll m a forall k a coll (m :: * -> *) a b. Monad m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b forall k a coll (m :: * -> *) a b. Monad m => ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b forall (m :: * -> *). Applicative m -> (forall a b. m a -> (a -> m b) -> m b) -> (forall a b. m a -> m b -> m b) -> (forall a. a -> m a) -> Monad m return :: a -> ResolutionT k a coll m a $creturn :: forall k a coll (m :: * -> *) a. Monad m => a -> ResolutionT k a coll m a >> :: ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b $c>> :: forall k a coll (m :: * -> *) a b. Monad m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b >>= :: ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b $c>>= :: forall k a coll (m :: * -> *) a b. Monad m => ResolutionT k a coll m a -> (a -> ResolutionT k a coll m b) -> ResolutionT k a coll m b $cp1Monad :: forall k a coll (m :: * -> *). Monad m => Applicative (ResolutionT k a coll m) Monad, Functor (ResolutionT k a coll m) a -> ResolutionT k a coll m a Functor (ResolutionT k a coll m) -> (forall a. a -> ResolutionT k a coll m a) -> (forall a b. ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b) -> (forall a b c. (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c) -> (forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b) -> (forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a) -> Applicative (ResolutionT k a coll m) ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c forall a. a -> ResolutionT k a coll m a forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a forall a b. ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b forall a b. ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b forall a b c. (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c forall k a coll (m :: * -> *). Applicative m => Functor (ResolutionT k a coll m) forall k a coll (m :: * -> *) a. Applicative m => a -> ResolutionT k a coll m a forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b forall k a coll (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c forall (f :: * -> *). Functor f -> (forall a. a -> f a) -> (forall a b. f (a -> b) -> f a -> f b) -> (forall a b c. (a -> b -> c) -> f a -> f b -> f c) -> (forall a b. f a -> f b -> f b) -> (forall a b. f a -> f b -> f a) -> Applicative f <* :: ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a $c<* :: forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m a *> :: ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b $c*> :: forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m b liftA2 :: (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c $cliftA2 :: forall k a coll (m :: * -> *) a b c. Applicative m => (a -> b -> c) -> ResolutionT k a coll m a -> ResolutionT k a coll m b -> ResolutionT k a coll m c <*> :: ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b $c<*> :: forall k a coll (m :: * -> *) a b. Applicative m => ResolutionT k a coll m (a -> b) -> ResolutionT k a coll m a -> ResolutionT k a coll m b pure :: a -> ResolutionT k a coll m a $cpure :: forall k a coll (m :: * -> *) a. Applicative m => a -> ResolutionT k a coll m a $cp1Applicative :: forall k a coll (m :: * -> *). Applicative m => Functor (ResolutionT k a coll m) Applicative, MonadReader (Resolution k a coll m) ) instance MonadTrans (ResolutionT k a coll) where lift :: m a -> ResolutionT k a coll m a lift = ReaderT (Resolution k a coll m) m a -> ResolutionT k a coll m a forall k a coll (m :: * -> *) x. ReaderT (Resolution k a coll m) m x -> ResolutionT k a coll m x ResolutionT (ReaderT (Resolution k a coll m) m a -> ResolutionT k a coll m a) -> (m a -> ReaderT (Resolution k a coll m) m a) -> m a -> ResolutionT k a coll m a forall b c a. (b -> c) -> (a -> b) -> a -> c . m a -> ReaderT (Resolution k a coll m) m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift