{-# LANGUAGE DeriveDataTypeable #-}
module Data.SignedMultiset (
SignedMultiset,
empty,
singleton,
insert,
insertMany,
delete,
deleteMany,
deleteAll,
null,
isSet,
isPositive,
isNegative,
size,
cardinality,
member,
notMember,
multiplicity,
isSubmultisetOf,
union,
additiveUnion,
intersection,
root,
shadow,
modulus,
signum,
unitstep,
multiply,
map,
additiveMap,
filter,
partition,
split,
foldr,
foldr',
foldl,
foldl',
toList,
toLists,
fromList,
fromLists,
Additive (..)
) where
import Prelude hiding (signum, null, map, filter, foldr, foldl)
import qualified Prelude (signum, filter, foldr)
import Control.Arrow ((***))
import Data.Function (on)
import Data.Data (Data (..), mkNoRepType)
import Data.Typeable (Typeable)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.SignedMultiset.Show (showsMembers)
import Data.SignedMultiset.Read (readsMembers, mapReadS)
newtype SignedMultiset a = SMS {forall a. SignedMultiset a -> Map a Int
unSMS :: Map a Int} deriving Typeable
norm :: Map a Int -> SignedMultiset a
norm :: forall a. Map a Int -> SignedMultiset a
norm = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (forall a. Eq a => a -> a -> Bool
/= Int
0)
instance Ord a => Eq (SignedMultiset a) where
== :: SignedMultiset a -> SignedMultiset a -> Bool
(==) = forall a. Eq a => a -> a -> Bool
(==) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS
instance Ord a => Ord (SignedMultiset a) where
compare :: SignedMultiset a -> SignedMultiset a -> Ordering
compare = forall a. Ord a => a -> a -> Ordering
compare forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS
instance Show a => Show (SignedMultiset a) where
showsPrec :: Int -> SignedMultiset a -> ShowS
showsPrec Int
_ = forall a. Show a => [(a, Int)] -> ShowS
showsMembers forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> [(a, Int)]
toList
instance (Ord a, Read a) => Read (SignedMultiset a) where
readsPrec :: Int -> ReadS (SignedMultiset a)
readsPrec = forall a b. (a -> b) -> ReadS a -> ReadS b
mapReadS forall a. Ord a => [(a, Int)] -> SignedMultiset a
fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Read a => Int -> ReadS [(a, Int)]
readsMembers
instance Ord a => Semigroup (SignedMultiset a) where
<> :: SignedMultiset a -> SignedMultiset a -> SignedMultiset a
(<>) = forall a.
Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
union
instance Ord a => Monoid (SignedMultiset a) where
mempty :: SignedMultiset a
mempty = forall a. SignedMultiset a
empty
mappend :: SignedMultiset a -> SignedMultiset a -> SignedMultiset a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
instance (Ord a, Data a) => Data (SignedMultiset a) where
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> SignedMultiset a -> c (SignedMultiset a)
gfoldl forall d b. Data d => c (d -> b) -> d -> c b
f forall g. g -> c g
z = forall d b. Data d => c (d -> b) -> d -> c b
f (forall g. g -> c g
z forall a. Ord a => [(a, Int)] -> SignedMultiset a
fromList) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> [(a, Int)]
toList
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (SignedMultiset a)
gunfold forall b r. Data b => c (b -> r) -> c r
_ forall r. r -> c r
_ = forall a. HasCallStack => String -> a
error String
"Data.Data.gunfold: abstract datatype"
toConstr :: SignedMultiset a -> Constr
toConstr SignedMultiset a
_ = forall a. HasCallStack => String -> a
error String
"Data.Data.toConstr: abstract datatype"
dataTypeOf :: SignedMultiset a -> DataType
dataTypeOf SignedMultiset a
_ = String -> DataType
mkNoRepType String
"Data.SignedMultiset.SignedMultiset"
empty :: SignedMultiset a
empty :: forall a. SignedMultiset a
empty = forall a. Map a Int -> SignedMultiset a
SMS forall k a. Map k a
Map.empty
singleton :: a -> SignedMultiset a
singleton :: forall a. a -> SignedMultiset a
singleton a
x = forall a. Map a Int -> SignedMultiset a
SMS (forall k a. k -> a -> Map k a
Map.singleton a
x Int
1)
insert :: Ord a => a -> SignedMultiset a -> SignedMultiset a
insert :: forall a. Ord a => a -> SignedMultiset a -> SignedMultiset a
insert a
x = forall a. Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
insertMany a
x Int
1
insertMany :: Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
insertMany :: forall a. Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
insertMany a
x Int
n = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a.
Ord k =>
(Maybe a -> Maybe a) -> k -> Map k a -> Map k a
Map.alter Maybe Int -> Maybe Int
f a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
where
f :: Maybe Int -> Maybe Int
f Maybe Int
Nothing = forall a. a -> Maybe a
Just Int
n
f (Just Int
m) = let k :: Int
k = Int
m forall a. Num a => a -> a -> a
+ Int
n in if Int
k forall a. Eq a => a -> a -> Bool
== Int
0 then forall a. Maybe a
Nothing else forall a. a -> Maybe a
Just Int
k
delete :: Ord a => a -> SignedMultiset a -> SignedMultiset a
delete :: forall a. Ord a => a -> SignedMultiset a -> SignedMultiset a
delete a
x = forall a. Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
deleteMany a
x Int
1
deleteMany :: Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
deleteMany :: forall a. Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
deleteMany a
x Int
n = forall a. Ord a => a -> Int -> SignedMultiset a -> SignedMultiset a
insertMany a
x (- Int
n)
deleteAll :: Ord a => a -> SignedMultiset a -> SignedMultiset a
deleteAll :: forall a. Ord a => a -> SignedMultiset a -> SignedMultiset a
deleteAll a
x = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => k -> Map k a -> Map k a
Map.delete a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
null :: SignedMultiset a -> Bool
null :: forall a. SignedMultiset a -> Bool
null = forall k a. Map k a -> Bool
Map.null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
isSet :: SignedMultiset a -> Bool
isSet :: forall a. SignedMultiset a -> Bool
isSet = forall a b k. (a -> b -> b) -> b -> Map k a -> b
Map.foldr (Bool -> Bool -> Bool
(&&) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Eq a => a -> a -> Bool
== Int
1)) Bool
True forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
isPositive :: SignedMultiset a -> Bool
isPositive :: forall a. SignedMultiset a -> Bool
isPositive = forall a b k. (a -> b -> b) -> b -> Map k a -> b
Map.foldr (Bool -> Bool -> Bool
(&&) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Ord a => a -> a -> Bool
> Int
0)) Bool
True forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
isNegative :: SignedMultiset a -> Bool
isNegative :: forall a. SignedMultiset a -> Bool
isNegative = forall a b k. (a -> b -> b) -> b -> Map k a -> b
Map.foldr (Bool -> Bool -> Bool
(&&) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Ord a => a -> a -> Bool
< Int
0)) Bool
True forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
size :: SignedMultiset a -> Int
size :: forall a. SignedMultiset a -> Int
size = forall k a. Map k a -> Int
Map.size forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
cardinality :: SignedMultiset a -> Int
cardinality :: forall a. SignedMultiset a -> Int
cardinality = forall a b k. (a -> b -> a) -> a -> Map k b -> a
Map.foldl' forall a. Num a => a -> a -> a
(+) Int
0 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
member :: Ord a => a -> SignedMultiset a -> Bool
member :: forall a. Ord a => a -> SignedMultiset a -> Bool
member a
x = forall k a. Ord k => k -> Map k a -> Bool
Map.member a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
notMember :: Ord a => a -> SignedMultiset a -> Bool
notMember :: forall a. Ord a => a -> SignedMultiset a -> Bool
notMember a
x = forall k a. Ord k => k -> Map k a -> Bool
Map.notMember a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
multiplicity :: Ord a => a -> SignedMultiset a -> Int
multiplicity :: forall a. Ord a => a -> SignedMultiset a -> Int
multiplicity a
x = forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Int
0 a
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
isSubmultisetOf :: Ord a => SignedMultiset a -> SignedMultiset a -> Bool
isSubmultisetOf :: forall a. Ord a => SignedMultiset a -> SignedMultiset a -> Bool
isSubmultisetOf = forall k a b.
Ord k =>
(a -> b -> Bool) -> Map k a -> Map k b -> Bool
Map.isSubmapOfBy forall a. Ord a => a -> a -> Bool
(<=) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS
union :: Ord a => SignedMultiset a -> SignedMultiset a -> SignedMultiset a
union :: forall a.
Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
union = forall a. Map a Int -> SignedMultiset a
SMS forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
`after` (forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Ord a => a -> a -> a
max forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS)
additiveUnion :: Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
additiveUnion :: forall a.
Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
additiveUnion = forall a. Map a Int -> SignedMultiset a
norm forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
`after` (forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith forall a. Num a => a -> a -> a
(+) forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS)
intersection :: Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
intersection :: forall a.
Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
intersection = forall a. Map a Int -> SignedMultiset a
SMS forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
`after` (forall k a b c.
Ord k =>
(a -> b -> c) -> Map k a -> Map k b -> Map k c
Map.intersectionWith forall a. Ord a => a -> a -> a
min forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. SignedMultiset a -> Map a Int
unSMS)
root :: SignedMultiset a -> SignedMultiset a
root :: forall a. SignedMultiset a -> SignedMultiset a
root = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (forall a b. a -> b -> a
const Int
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
shadow :: SignedMultiset a -> SignedMultiset a
shadow :: forall a. SignedMultiset a -> SignedMultiset a
shadow = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
modulus :: SignedMultiset a -> SignedMultiset a
modulus :: forall a. SignedMultiset a -> SignedMultiset a
modulus = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall a. Num a => a -> a
abs forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
signum :: SignedMultiset a -> SignedMultiset a
signum :: forall a. SignedMultiset a -> SignedMultiset a
signum = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall a. Num a => a -> a
Prelude.signum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
unitstep :: SignedMultiset a -> SignedMultiset a
unitstep :: forall a. SignedMultiset a -> SignedMultiset a
unitstep = forall a. Map a Int -> SignedMultiset a
norm forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall {a} {a}. (Ord a, Num a, Num a) => a -> a
u forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
where
u :: a -> a
u a
n = if a
n forall a. Ord a => a -> a -> Bool
> a
0 then a
1 else a
0
multiply :: Int -> SignedMultiset a -> SignedMultiset a
multiply :: forall a. Int -> SignedMultiset a -> SignedMultiset a
multiply Int
n = forall a. Map a Int -> SignedMultiset a
norm forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (Int
n forall a. Num a => a -> a -> a
*) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
map :: Ord b => (a -> b) -> SignedMultiset a -> SignedMultiset b
map :: forall b a.
Ord b =>
(a -> b) -> SignedMultiset a -> SignedMultiset b
map a -> b
f = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k2 a k1.
Ord k2 =>
(a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysWith forall a. Ord a => a -> a -> a
max a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
additiveMap :: Ord b => (a -> b) -> SignedMultiset a -> SignedMultiset b
additiveMap :: forall b a.
Ord b =>
(a -> b) -> SignedMultiset a -> SignedMultiset b
additiveMap a -> b
f = forall a. Map a Int -> SignedMultiset a
norm forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k2 a k1.
Ord k2 =>
(a -> a -> a) -> (k1 -> k2) -> Map k1 a -> Map k2 a
Map.mapKeysWith forall a. Num a => a -> a -> a
(+) a -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
filter :: (a -> Int -> Bool) -> SignedMultiset a -> SignedMultiset a
filter :: forall a.
(a -> Int -> Bool) -> SignedMultiset a -> SignedMultiset a
filter a -> Int -> Bool
p = forall a. Map a Int -> SignedMultiset a
SMS forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. (k -> a -> Bool) -> Map k a -> Map k a
Map.filterWithKey a -> Int -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
partition :: (a -> Int -> Bool) -> SignedMultiset a ->
(SignedMultiset a, SignedMultiset a)
partition :: forall a.
(a -> Int -> Bool)
-> SignedMultiset a -> (SignedMultiset a, SignedMultiset a)
partition a -> Int -> Bool
p = (forall a. Map a Int -> SignedMultiset a
SMS forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** forall a. Map a Int -> SignedMultiset a
SMS) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. (k -> a -> Bool) -> Map k a -> (Map k a, Map k a)
Map.partitionWithKey a -> Int -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
split :: Int -> SignedMultiset a -> (SignedMultiset a, SignedMultiset a)
split :: forall a.
Int -> SignedMultiset a -> (SignedMultiset a, SignedMultiset a)
split Int
n = forall a.
(a -> Int -> Bool)
-> SignedMultiset a -> (SignedMultiset a, SignedMultiset a)
partition forall {b}. b -> Int -> Bool
p
where
p :: b -> Int -> Bool
p = forall a b. a -> b -> a
const (forall a. Ord a => a -> a -> Bool
< Int
n)
foldr :: (a -> Int -> b -> b) -> b -> SignedMultiset a -> b
foldr :: forall a b. (a -> Int -> b -> b) -> b -> SignedMultiset a -> b
foldr a -> Int -> b -> b
f b
z = forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey a -> Int -> b -> b
f b
z forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
foldr' :: (a -> Int -> b -> b) -> b -> SignedMultiset a -> b
foldr' :: forall a b. (a -> Int -> b -> b) -> b -> SignedMultiset a -> b
foldr' a -> Int -> b -> b
f b
z = forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey' a -> Int -> b -> b
f b
z forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
foldl :: (a -> b -> Int -> a) -> a -> SignedMultiset b -> a
foldl :: forall a b. (a -> b -> Int -> a) -> a -> SignedMultiset b -> a
foldl a -> b -> Int -> a
f a
z = forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey a -> b -> Int -> a
f a
z forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
foldl' :: (a -> b -> Int -> a) -> a -> SignedMultiset b -> a
foldl' :: forall a b. (a -> b -> Int -> a) -> a -> SignedMultiset b -> a
foldl' a -> b -> Int -> a
f a
z = forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey' a -> b -> Int -> a
f a
z forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
toList :: SignedMultiset a -> [(a, Int)]
toList :: forall a. SignedMultiset a -> [(a, Int)]
toList = forall k a. Map k a -> [(k, a)]
Map.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. SignedMultiset a -> Map a Int
unSMS
toLists :: SignedMultiset a -> ([a], [a])
toLists :: forall a. SignedMultiset a -> ([a], [a])
toLists = forall a b. (a -> Int -> b -> b) -> b -> SignedMultiset a -> b
foldr forall {a}. a -> Int -> ([a], [a]) -> ([a], [a])
f forall {a} {a}. ([a], [a])
z
where
z :: ([a], [a])
z = ([], [])
f :: a -> Int -> ([a], [a]) -> ([a], [a])
f a
x Int
n ([a]
xs, [a]
ys) =
if Int
n forall a. Ord a => a -> a -> Bool
> Int
0 then (forall a. Int -> a -> [a]
replicate Int
n a
x forall a. [a] -> [a] -> [a]
++ [a]
xs, [a]
ys) else ([a]
xs, forall a. Int -> a -> [a]
replicate (- Int
n) a
x forall a. [a] -> [a] -> [a]
++ [a]
ys)
fromList :: Ord a => [(a, Int)] -> SignedMultiset a
fromList :: forall a. Ord a => [(a, Int)] -> SignedMultiset a
fromList = forall a. Map a Int -> SignedMultiset a
norm forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith forall a. Num a => a -> a -> a
(+) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
Prelude.filter ((forall a. Eq a => a -> a -> Bool
/= Int
0) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd)
fromLists :: Ord a => [a] -> [a] -> SignedMultiset a
fromLists :: forall a. Ord a => [a] -> [a] -> SignedMultiset a
fromLists = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Prelude.foldr forall a. Ord a => a -> SignedMultiset a -> SignedMultiset a
delete forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
Prelude.foldr forall a. Ord a => a -> SignedMultiset a -> SignedMultiset a
insert forall a. SignedMultiset a
empty
newtype Additive a = Additive {forall a. Additive a -> SignedMultiset a
getAdditive :: SignedMultiset a}
deriving (Additive a -> Additive a -> Bool
forall a. Ord a => Additive a -> Additive a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Additive a -> Additive a -> Bool
$c/= :: forall a. Ord a => Additive a -> Additive a -> Bool
== :: Additive a -> Additive a -> Bool
$c== :: forall a. Ord a => Additive a -> Additive a -> Bool
Eq, Additive a -> Additive a -> Bool
Additive a -> Additive a -> Ordering
Additive a -> Additive a -> Additive a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Additive a)
forall a. Ord a => Additive a -> Additive a -> Bool
forall a. Ord a => Additive a -> Additive a -> Ordering
forall a. Ord a => Additive a -> Additive a -> Additive a
min :: Additive a -> Additive a -> Additive a
$cmin :: forall a. Ord a => Additive a -> Additive a -> Additive a
max :: Additive a -> Additive a -> Additive a
$cmax :: forall a. Ord a => Additive a -> Additive a -> Additive a
>= :: Additive a -> Additive a -> Bool
$c>= :: forall a. Ord a => Additive a -> Additive a -> Bool
> :: Additive a -> Additive a -> Bool
$c> :: forall a. Ord a => Additive a -> Additive a -> Bool
<= :: Additive a -> Additive a -> Bool
$c<= :: forall a. Ord a => Additive a -> Additive a -> Bool
< :: Additive a -> Additive a -> Bool
$c< :: forall a. Ord a => Additive a -> Additive a -> Bool
compare :: Additive a -> Additive a -> Ordering
$ccompare :: forall a. Ord a => Additive a -> Additive a -> Ordering
Ord, Int -> Additive a -> ShowS
forall a. Show a => Int -> Additive a -> ShowS
forall a. Show a => [Additive a] -> ShowS
forall a. Show a => Additive a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Additive a] -> ShowS
$cshowList :: forall a. Show a => [Additive a] -> ShowS
show :: Additive a -> String
$cshow :: forall a. Show a => Additive a -> String
showsPrec :: Int -> Additive a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Additive a -> ShowS
Show, ReadPrec [Additive a]
ReadPrec (Additive a)
ReadS [Additive a]
forall a. (Ord a, Read a) => ReadPrec [Additive a]
forall a. (Ord a, Read a) => ReadPrec (Additive a)
forall a. (Ord a, Read a) => Int -> ReadS (Additive a)
forall a. (Ord a, Read a) => ReadS [Additive a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Additive a]
$creadListPrec :: forall a. (Ord a, Read a) => ReadPrec [Additive a]
readPrec :: ReadPrec (Additive a)
$creadPrec :: forall a. (Ord a, Read a) => ReadPrec (Additive a)
readList :: ReadS [Additive a]
$creadList :: forall a. (Ord a, Read a) => ReadS [Additive a]
readsPrec :: Int -> ReadS (Additive a)
$creadsPrec :: forall a. (Ord a, Read a) => Int -> ReadS (Additive a)
Read)
instance Ord a => Semigroup (Additive a) where
<> :: Additive a -> Additive a -> Additive a
(<>) = forall a. SignedMultiset a -> Additive a
Additive forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
`after` (forall a.
Ord a =>
SignedMultiset a -> SignedMultiset a -> SignedMultiset a
additiveUnion forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` forall a. Additive a -> SignedMultiset a
getAdditive)
instance Ord a => Monoid (Additive a) where
mempty :: Additive a
mempty = forall a. SignedMultiset a -> Additive a
Additive forall a. SignedMultiset a
empty
mappend :: Additive a -> Additive a -> Additive a
mappend = forall a. Semigroup a => a -> a -> a
(<>)
after :: (c -> d) -> (a -> b -> c) -> a -> b -> d
after :: forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
after c -> d
f a -> b -> c
(.+.) a
x b
y = c -> d
f (a
x a -> b -> c
.+. b
y)