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
31 | (++) : Bag a -> Bag a -> Bag a
32 | (MkBag xs) ++ (MkBag ys) = MkBag (xs ++ ys)
36 | map f (MkBag xs) = MkBag (map f xs)
39 | Applicative Bag where
40 | pure a = MkBag (pure a)
41 | (MkBag fs) <*> (MkBag xs) = MkBag (fs <*> xs)
45 | join (MkBag b) = MkBag $
join (toList <$> b)
49 | foldr f z (MkBag xs) = foldr f z xs
52 | namespace Quantifiers
55 | All : (p : a -> Type) -> Bag a -> Type
56 | All p (MkBag xs) = All p xs
59 | Any : (p : a -> Type) -> Bag a -> Type
60 | Any p (MkBag xs) = Any p xs