{-# 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