-
Notifications
You must be signed in to change notification settings - Fork 0
/
Delta.hs
35 lines (24 loc) · 769 Bytes
/
Delta.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
module Delta where
import Data.Set (Set, (\\), union)
import qualified Data.Set as Set
type Delta a = (Set a, Set a)
fromSet :: Set a -> Delta a
fromSet s = (s, Set.empty)
fromList :: Ord a => [a] -> Delta a
fromList l = (Set.fromList l, Set.empty)
neg :: Delta a -> Delta a
neg (p,n) = (n, p)
positive :: Delta a -> Set a
positive (p,_) = p
negative :: Delta a -> Set a
negative (_,n) = n
merge :: Ord a => Delta a -> Delta a -> Delta a
(p1, n1) `merge` (p2, n2) = (p, n) where
p = (p1 \\ n2) `union` (p2 \\ n1)
n = (n1 \\ p2) `union` (n2 \\ p1)
(#+) :: Ord a => Delta a -> Delta a -> Delta a
(#+) = merge
(#-) :: Ord a => Delta a -> Delta a -> Delta a
m #- n = m #+ (neg n)
delta_union :: Ord a => Delta a -> Set a
delta_union (p1, n1) = p1 `union` n1