-- -- $Id$

module Autolib.Util.DPL_Set

( value, values )

where


import qualified Autolib.Util.DPL as D
import Autolib.Simple_Set
import Control.Monad ( guard )
-- import Data.Set

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)