{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Delta.Set
(
DeltaSet1 (..)
, DeltaSet
, diffSet
, listFromDeltaSet
, deltaSetFromList
) where
import Prelude
import Data.Delta.Core
( Delta (..)
)
import Data.Set
( Set
)
import qualified Data.Set as Set
data DeltaSet1 a
= Insert a
| Delete a
deriving (DeltaSet1 a -> DeltaSet1 a -> Bool
(DeltaSet1 a -> DeltaSet1 a -> Bool)
-> (DeltaSet1 a -> DeltaSet1 a -> Bool) -> Eq (DeltaSet1 a)
forall a. Eq a => DeltaSet1 a -> DeltaSet1 a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => DeltaSet1 a -> DeltaSet1 a -> Bool
== :: DeltaSet1 a -> DeltaSet1 a -> Bool
$c/= :: forall a. Eq a => DeltaSet1 a -> DeltaSet1 a -> Bool
/= :: DeltaSet1 a -> DeltaSet1 a -> Bool
Eq, Eq (DeltaSet1 a)
Eq (DeltaSet1 a) =>
(DeltaSet1 a -> DeltaSet1 a -> Ordering)
-> (DeltaSet1 a -> DeltaSet1 a -> Bool)
-> (DeltaSet1 a -> DeltaSet1 a -> Bool)
-> (DeltaSet1 a -> DeltaSet1 a -> Bool)
-> (DeltaSet1 a -> DeltaSet1 a -> Bool)
-> (DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a)
-> (DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a)
-> Ord (DeltaSet1 a)
DeltaSet1 a -> DeltaSet1 a -> Bool
DeltaSet1 a -> DeltaSet1 a -> Ordering
DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 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 (DeltaSet1 a)
forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Bool
forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Ordering
forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a
$ccompare :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Ordering
compare :: DeltaSet1 a -> DeltaSet1 a -> Ordering
$c< :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Bool
< :: DeltaSet1 a -> DeltaSet1 a -> Bool
$c<= :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Bool
<= :: DeltaSet1 a -> DeltaSet1 a -> Bool
$c> :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Bool
> :: DeltaSet1 a -> DeltaSet1 a -> Bool
$c>= :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> Bool
>= :: DeltaSet1 a -> DeltaSet1 a -> Bool
$cmax :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a
max :: DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a
$cmin :: forall a. Ord a => DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a
min :: DeltaSet1 a -> DeltaSet1 a -> DeltaSet1 a
Ord, Int -> DeltaSet1 a -> ShowS
[DeltaSet1 a] -> ShowS
DeltaSet1 a -> String
(Int -> DeltaSet1 a -> ShowS)
-> (DeltaSet1 a -> String)
-> ([DeltaSet1 a] -> ShowS)
-> Show (DeltaSet1 a)
forall a. Show a => Int -> DeltaSet1 a -> ShowS
forall a. Show a => [DeltaSet1 a] -> ShowS
forall a. Show a => DeltaSet1 a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> DeltaSet1 a -> ShowS
showsPrec :: Int -> DeltaSet1 a -> ShowS
$cshow :: forall a. Show a => DeltaSet1 a -> String
show :: DeltaSet1 a -> String
$cshowList :: forall a. Show a => [DeltaSet1 a] -> ShowS
showList :: [DeltaSet1 a] -> ShowS
Show)
instance Ord a => Delta (DeltaSet1 a) where
type Base (DeltaSet1 a) = Set a
apply :: DeltaSet1 a -> Base (DeltaSet1 a) -> Base (DeltaSet1 a)
apply (Insert a
a) = a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
a
apply (Delete a
a) = a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.delete a
a
data DeltaSet a = DeltaSet
{ forall a. DeltaSet a -> Set a
inserts :: Set a
, forall a. DeltaSet a -> Set a
deletes :: Set a
}
deriving (DeltaSet a -> DeltaSet a -> Bool
(DeltaSet a -> DeltaSet a -> Bool)
-> (DeltaSet a -> DeltaSet a -> Bool) -> Eq (DeltaSet a)
forall a. Eq a => DeltaSet a -> DeltaSet a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => DeltaSet a -> DeltaSet a -> Bool
== :: DeltaSet a -> DeltaSet a -> Bool
$c/= :: forall a. Eq a => DeltaSet a -> DeltaSet a -> Bool
/= :: DeltaSet a -> DeltaSet a -> Bool
Eq)
instance Ord a => Delta (DeltaSet a) where
type Base (DeltaSet a) = Set a
apply :: DeltaSet a -> Base (DeltaSet a) -> Base (DeltaSet a)
apply (DeltaSet Set a
i Set a
d) Base (DeltaSet a)
x = Set a
i Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` (Set a
Base (DeltaSet a)
x Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set a
d)
diffSet :: Ord a => Set a -> Set a -> DeltaSet a
diffSet :: forall a. Ord a => Set a -> Set a -> DeltaSet a
diffSet Set a
new Set a
old =
DeltaSet
{ inserts :: Set a
inserts = Set a
new Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set a
old
, deletes :: Set a
deletes = Set a
old Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set a
new
}
listFromDeltaSet :: DeltaSet a -> [DeltaSet1 a]
listFromDeltaSet :: forall a. DeltaSet a -> [DeltaSet1 a]
listFromDeltaSet DeltaSet{Set a
inserts :: forall a. DeltaSet a -> Set a
inserts :: Set a
inserts,Set a
deletes :: forall a. DeltaSet a -> Set a
deletes :: Set a
deletes} =
(a -> DeltaSet1 a) -> [a] -> [DeltaSet1 a]
forall a b. (a -> b) -> [a] -> [b]
map a -> DeltaSet1 a
forall a. a -> DeltaSet1 a
Insert (Set a -> [a]
forall a. Set a -> [a]
Set.toList Set a
inserts) [DeltaSet1 a] -> [DeltaSet1 a] -> [DeltaSet1 a]
forall a. Semigroup a => a -> a -> a
<> (a -> DeltaSet1 a) -> [a] -> [DeltaSet1 a]
forall a b. (a -> b) -> [a] -> [b]
map a -> DeltaSet1 a
forall a. a -> DeltaSet1 a
Delete (Set a -> [a]
forall a. Set a -> [a]
Set.toList Set a
deletes)
deltaSetFromList :: Ord a => [DeltaSet1 a] -> DeltaSet a
deltaSetFromList :: forall a. Ord a => [DeltaSet1 a] -> DeltaSet a
deltaSetFromList = (DeltaSet1 a -> DeltaSet a -> DeltaSet a)
-> DeltaSet a -> [DeltaSet1 a] -> DeltaSet a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr DeltaSet1 a -> DeltaSet a -> DeltaSet a
forall {a}. Ord a => DeltaSet1 a -> DeltaSet a -> DeltaSet a
step DeltaSet a
forall {a}. DeltaSet a
empty
where
empty :: DeltaSet a
empty = Set a -> Set a -> DeltaSet a
forall a. Set a -> Set a -> DeltaSet a
DeltaSet Set a
forall a. Set a
Set.empty Set a
forall a. Set a
Set.empty
step :: DeltaSet1 a -> DeltaSet a -> DeltaSet a
step (Insert a
a) (DeltaSet Set a
i Set a
d) = Set a -> Set a -> DeltaSet a
forall a. Set a -> Set a -> DeltaSet a
DeltaSet (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
a Set a
i) (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.delete a
a Set a
d)
step (Delete a
a) (DeltaSet Set a
i Set a
d) = Set a -> Set a -> DeltaSet a
forall a. Set a -> Set a -> DeltaSet a
DeltaSet (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.delete a
a Set a
i) (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
Set.insert a
a Set a
d)
instance Ord a => Semigroup (DeltaSet a) where
(DeltaSet Set a
i1 Set a
d1) <> :: DeltaSet a -> DeltaSet a -> DeltaSet a
<> (DeltaSet Set a
i2 Set a
d2) = Set a -> Set a -> DeltaSet a
forall a. Set a -> Set a -> DeltaSet a
DeltaSet
(Set a
i1 Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` (Set a
i2 Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set a
d1))
(Set a
d1 Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` (Set a
d2 Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set a
i1))
instance Ord a => Monoid (DeltaSet a) where
mempty :: DeltaSet a
mempty = Set a -> Set a -> DeltaSet a
forall a. Set a -> Set a -> DeltaSet a
DeltaSet Set a
forall a. Set a
Set.empty Set a
forall a. Set a
Set.empty