{-# 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 = forall a (f :: * -> *). (Mergeable a, 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 = forall a (f :: * -> *). (Mergeable a, 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 = 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 = 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 = forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith forall a. Mergeable a => a -> a -> a
(<||>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. [a] -> [a] -> [a]
(++) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [(k, a)]
Map.toList) []
mergeAll :: forall (f :: * -> *). Foldable f => f (Map k a) -> Map k a
mergeAll = forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith forall a. Mergeable a => a -> a -> a
(<&&>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. [a] -> [a] -> [a]
(++) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [(k, a)]
Map.toList) []