module Autolib.Util.DPL_Set
( value, values )
where
import qualified Autolib.Util.DPL as D
import Autolib.Simple_Set
import Control.Monad ( guard )
lift :: Ord b
=> ( (b,b) -> Set b )
-> ( [(Set b, Set b)] -> Set b )
lift :: forall b. Ord b => ((b, b) -> Set b) -> [(Set b, Set b)] -> Set b
lift (b, b) -> Set b
combine [(Set b, Set b)]
xys = [b] -> Set b
forall a. Ord a => [a] -> Set a
mkSet ([b] -> Set b) -> [b] -> Set b
forall a b. (a -> b) -> a -> b
$ do
(xs, ys) <- [(Set b, Set b)]
xys
guard $ not $ isEmptySet xs
guard $ not $ isEmptySet ys
x <- setToList xs
y <- setToList ys
setToList $ combine (x, y)
value :: (Ord a, Ord b)
=> (a -> Set b) -> ((b,b) -> Set b) -> [a] -> Set b
value :: forall a b.
(Ord a, Ord b) =>
(a -> Set b) -> ((b, b) -> Set b) -> [a] -> Set b
value a -> Set b
unit (b, b) -> Set b
combine = (a -> Set b) -> ([(Set b, Set b)] -> Set b) -> [a] -> Set b
forall a b. Ord a => (a -> b) -> ([(b, b)] -> b) -> [a] -> b
D.value a -> Set b
unit (((b, b) -> Set b) -> [(Set b, Set b)] -> Set b
forall b. Ord b => ((b, b) -> Set b) -> [(Set b, Set b)] -> Set b
lift (b, b) -> Set b
combine)
values :: (Ord a, Ord b)
=> (a -> Set b) -> ((b,b) -> Set b) -> [[a]] -> [([a],Set b)]
values :: forall a b.
(Ord a, Ord b) =>
(a -> Set b) -> ((b, b) -> Set b) -> [[a]] -> [([a], Set b)]
values a -> Set b
unit (b, b) -> Set b
combine = (a -> Set b)
-> ([(Set b, Set b)] -> Set b) -> [[a]] -> [([a], Set b)]
forall a b.
Ord a =>
(a -> b) -> ([(b, b)] -> b) -> [[a]] -> [([a], b)]
D.values a -> Set b
unit (((b, b) -> Set b) -> [(Set b, Set b)] -> Set b
forall b. Ord b => ((b, b) -> Set b) -> [(Set b, Set b)] -> Set b
lift (b, b) -> Set b
combine)