{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeFamilies #-}
module Base.Mergeable (
Mergeable(..),
PreserveMerge(..),
(<||>),
(<&&>),
) where
import Data.Map as Map hiding (foldr)
class Mergeable a where
mergeAny :: Foldable f => f a -> a
mergeAll :: Foldable f => f a -> a
class (Bounded a, Mergeable a) => PreserveMerge a where
type T a :: *
convertMerge :: Mergeable b => (T a -> b) -> a -> b
(<||>) :: Mergeable a => a -> a -> a
<||> :: forall a. Mergeable a => a -> a -> a
(<||>) a
x a
y = [a] -> a
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f a -> a
mergeAny [a
x,a
y]
infixl 2 <||>
(<&&>) :: Mergeable a => a -> a -> a
<&&> :: forall a. Mergeable a => a -> a -> a
(<&&>) a
x a
y = [a] -> a
forall a (f :: * -> *). (Mergeable a, Foldable f) => f a -> a
forall (f :: * -> *). Foldable f => f a -> a
mergeAll [a
x,a
y]
infixl 2 <&&>
instance Mergeable Bool where
mergeAny :: forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAny = (Bool -> Bool -> Bool) -> Bool -> f Bool -> Bool
forall a b. (a -> b -> b) -> b -> f a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Bool -> Bool -> Bool
(||) Bool
False
mergeAll :: forall (f :: * -> *). Foldable f => f Bool -> Bool
mergeAll = (Bool -> Bool -> Bool) -> Bool -> f Bool -> Bool
forall a b. (a -> b -> b) -> b -> f a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Bool -> Bool -> Bool
(&&) Bool
True
instance (Ord k, Mergeable a) => Mergeable (Map k a) where
mergeAny :: forall (f :: * -> *). Foldable f => f (Map k a) -> Map k a
mergeAny = (a -> a -> a) -> [(k, a)] -> Map k a
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith a -> a -> a
forall a. Mergeable a => a -> a -> a
(<||>) ([(k, a)] -> Map k a)
-> (f (Map k a) -> [(k, a)]) -> f (Map k a) -> Map k a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Map k a -> [(k, a)] -> [(k, a)])
-> [(k, a)] -> f (Map k a) -> [(k, a)]
forall a b. (a -> b -> b) -> b -> f a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ([(k, a)] -> [(k, a)] -> [(k, a)]
forall a. [a] -> [a] -> [a]
(++) ([(k, a)] -> [(k, a)] -> [(k, a)])
-> (Map k a -> [(k, a)]) -> Map k a -> [(k, a)] -> [(k, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
Map.toList) []
mergeAll :: forall (f :: * -> *). Foldable f => f (Map k a) -> Map k a
mergeAll = (a -> a -> a) -> [(k, a)] -> Map k a
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith a -> a -> a
forall a. Mergeable a => a -> a -> a
(<&&>) ([(k, a)] -> Map k a)
-> (f (Map k a) -> [(k, a)]) -> f (Map k a) -> Map k a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Map k a -> [(k, a)] -> [(k, a)])
-> [(k, a)] -> f (Map k a) -> [(k, a)]
forall a b. (a -> b -> b) -> b -> f a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ([(k, a)] -> [(k, a)] -> [(k, a)]
forall a. [a] -> [a] -> [a]
(++) ([(k, a)] -> [(k, a)] -> [(k, a)])
-> (Map k a -> [(k, a)]) -> Map k a -> [(k, a)] -> [(k, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map k a -> [(k, a)]
forall k a. Map k a -> [(k, a)]
Map.toList) []