{-# LANGUAGE TypeFamilies #-}
module Data.Recursive.Set (RSet, module Data.Recursive.Set) where
import qualified Data.Set as S
import Control.Monad hiding (when)
import Data.Recursive.Internal
import qualified Data.Propagator.Purify as Purify
import Data.Propagator.Naive
import Data.Propagator.P2
get :: RSet a -> S.Set a
get :: forall a. RSet a -> Set a
get (RSet Purify (Prop (Set a))
p) = forall pa a. Propagator pa a => Purify pa -> a
Purify.get Purify (Prop (Set a))
p
mk :: S.Set a -> RSet a
mk :: forall a. Set a -> RSet a
mk Set a
s = forall a. Purify (Prop (Set a)) -> RSet a
RSet forall a b. (a -> b) -> a -> b
$ forall p a. Propagator p a => a -> Purify p
Purify.mk Set a
s
empty :: RSet a
empty :: forall a. RSet a
empty = forall a. Purify (Prop (Set a)) -> RSet a
RSet forall a b. (a -> b) -> a -> b
$ forall p a. Propagator p a => a -> Purify p
Purify.mk forall a. Set a
S.empty
singleton :: a -> RSet a
singleton :: forall a. a -> RSet a
singleton a
x = forall a. Purify (Prop (Set a)) -> RSet a
RSet forall a b. (a -> b) -> a -> b
$ forall p a. Propagator p a => a -> Purify p
Purify.mk forall a b. (a -> b) -> a -> b
$ forall a. a -> Set a
S.singleton a
x
insert :: Ord a => a -> RSet a -> RSet a
insert :: forall a. Ord a => a -> RSet a -> RSet a
insert a
x = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => (a -> b) -> Prop a -> Prop b -> IO ()
lift1 forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> Set a -> Set a
S.insert a
x
delete :: Ord a => a -> RSet a -> RSet a
delete :: forall a. Ord a => a -> RSet a -> RSet a
delete a
x = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => (a -> b) -> Prop a -> Prop b -> IO ()
lift1 forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> Set a -> Set a
S.delete a
x
filter :: Ord a => (a -> Bool) -> RSet a -> RSet a
filter :: forall a. Ord a => (a -> Bool) -> RSet a -> RSet a
filter a -> Bool
f = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => (a -> b) -> Prop a -> Prop b -> IO ()
lift1 forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> Set a -> Set a
S.filter a -> Bool
f
union :: Ord a => RSet a -> RSet a -> RSet a
union :: forall a. Ord a => RSet a -> RSet a -> RSet a
union = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b pc c.
(Propagator pa a, Propagator pb b, Propagator pc c) =>
(pa -> pb -> pc -> IO ()) -> Purify pa -> Purify pb -> Purify pc
Purify.def2 forall a b. (a -> b) -> a -> b
$ forall c a b.
POrder c =>
(a -> b -> c) -> Prop a -> Prop b -> Prop c -> IO ()
lift2 forall a. Ord a => Set a -> Set a -> Set a
S.union
unions :: Ord a => [RSet a] -> RSet a
unions :: forall a. Ord a => [RSet a] -> RSet a
unions = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
([pa] -> pb -> IO ()) -> [Purify pa] -> Purify pb
Purify.defList forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => ([a] -> b) -> [Prop a] -> Prop b -> IO ()
liftList forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
S.unions
intersection :: Ord a => RSet a -> RSet a -> RSet a
intersection :: forall a. Ord a => RSet a -> RSet a -> RSet a
intersection = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b pc c.
(Propagator pa a, Propagator pb b, Propagator pc c) =>
(pa -> pb -> pc -> IO ()) -> Purify pa -> Purify pb -> Purify pc
Purify.def2 forall a b. (a -> b) -> a -> b
$ forall c a b.
POrder c =>
(a -> b -> c) -> Prop a -> Prop b -> Prop c -> IO ()
lift2 forall a. Ord a => Set a -> Set a -> Set a
S.intersection
member :: Ord a => a -> RSet a -> RBool
member :: forall a. Ord a => a -> RSet a -> RBool
member a
x = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ \Prop (Set a)
ps P2
pb -> do
let update :: IO ()
update = do
Set a
s <- forall a. Prop a -> IO a
readProp Prop (Set a)
ps
if forall a. Ord a => a -> Set a -> Bool
S.member a
x Set a
s then P2 -> IO ()
setTop P2
pb else forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
forall a. Prop a -> IO () -> IO ()
watchProp Prop (Set a)
ps IO ()
update
IO ()
update
notMember :: Ord a => a -> RSet a -> RDualBool
notMember :: forall a. Ord a => a -> RSet a -> RDualBool
notMember a
x = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ \Prop (Set a)
ps P2
pb -> do
let update :: IO ()
update = do
Set a
s <- forall a. Prop a -> IO a
readProp Prop (Set a)
ps
if forall a. Ord a => a -> Set a -> Bool
S.member a
x Set a
s then P2 -> IO ()
setTop P2
pb else forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
forall a. Prop a -> IO () -> IO ()
watchProp Prop (Set a)
ps IO ()
update
IO ()
update
null :: RSet a -> RDualBool
null :: forall a. RSet a -> RDualBool
null = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ \Prop (Set a)
ps P2
pb -> do
let update :: IO ()
update = do
Set a
s <- forall a. Prop a -> IO a
readProp Prop (Set a)
ps
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (forall a. Set a -> Bool
S.null Set a
s) forall a b. (a -> b) -> a -> b
$ P2 -> IO ()
setTop P2
pb
forall a. Prop a -> IO () -> IO ()
watchProp Prop (Set a)
ps IO ()
update
IO ()
update
disjoint :: Ord a => RSet a -> RSet a -> RDualBool
disjoint :: forall a. Ord a => RSet a -> RSet a -> RDualBool
disjoint = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b pc c.
(Propagator pa a, Propagator pb b, Propagator pc c) =>
(pa -> pb -> pc -> IO ()) -> Purify pa -> Purify pb -> Purify pc
Purify.def2 forall a b. (a -> b) -> a -> b
$ \Prop (Set a)
ps1 Prop (Set a)
ps2 P2
pb -> do
let update :: IO ()
update = do
Set a
s1 <- forall a. Prop a -> IO a
readProp Prop (Set a)
ps1
Set a
s2 <- forall a. Prop a -> IO a
readProp Prop (Set a)
ps2
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (forall a. Ord a => Set a -> Set a -> Bool
S.disjoint Set a
s1 Set a
s2) forall a b. (a -> b) -> a -> b
$ P2 -> IO ()
setTop P2
pb
forall a. Prop a -> IO () -> IO ()
watchProp Prop (Set a)
ps1 IO ()
update
forall a. Prop a -> IO () -> IO ()
watchProp Prop (Set a)
ps2 IO ()
update
IO ()
update
when :: RBool -> RSet a -> RSet a
when :: forall a. RBool -> RSet a -> RSet a
when = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b pc c.
(Propagator pa a, Propagator pb b, Propagator pc c) =>
(pa -> pb -> pc -> IO ()) -> Purify pa -> Purify pb -> Purify pc
Purify.def2 forall a b. (a -> b) -> a -> b
$ \P2
pb Prop (Set a)
ps1 Prop (Set a)
ps2 -> do
P2 -> IO () -> IO ()
whenTop P2
pb forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => (a -> b) -> Prop a -> Prop b -> IO ()
lift1 forall a. a -> a
Prelude.id Prop (Set a)
ps1 Prop (Set a)
ps2
id :: RSet a -> RSet a
id :: forall a. RSet a -> RSet a
id = forall a. Coercible a (OpenR a) => OpenR a -> a
openR forall a b. (a -> b) -> a -> b
$ forall pa a pb b.
(Propagator pa a, Propagator pb b) =>
(pa -> pb -> IO ()) -> Purify pa -> Purify pb
Purify.def1 forall a b. (a -> b) -> a -> b
$ forall b a. POrder b => (a -> b) -> Prop a -> Prop b -> IO ()
lift1 forall a. a -> a
Prelude.id