3 | import Data.List.Quantifiers
10 | record Bag (a : Type) where
15 | Multiset : Type -> Type
19 | multiplicities : Eq a => List a -> (a -> Nat)
20 | multiplicities [] = const 0
21 | multiplicities (x :: xs) = \y => applyWhen (x == y) (1 +) (multiplicities xs y)
26 | multiplicities : Eq a => Bag a -> (a -> Nat)
27 | multiplicities = multiplicities . toList
33 | (++) : Bag a -> Bag a -> Bag a
34 | (MkBag xs) ++ (MkBag ys) = MkBag (xs ++ ys)
38 | map f (MkBag xs) = MkBag (map f xs)
41 | Applicative Bag where
42 | pure a = MkBag (pure a)
43 | (MkBag fs) <*> (MkBag xs) = MkBag (fs <*> xs)
47 | join (MkBag b) = MkBag $
join (toList <$> b)
51 | foldr f z (MkBag xs) = foldr f z xs
54 | namespace Quantifiers
56 | All : (p : a -> Type) -> Bag a -> Type
57 | All p (MkBag xs) = All p xs
60 | Any : (p : a -> Type) -> Bag a -> Type
61 | Any p (MkBag xs) = Any p xs