module Autolib.Util.Closure where

-- -- $Id$

import Autolib.Set
import Autolib.Util.Splits
import Autolib.Util.Uniq

unary_binary :: Ord a
       => ( a -> [ a ] )
       -> ( a -> a -> [ a ] )
       -> [ a ]
       -> [ a ]
unary_binary :: forall a. Ord a => (a -> [a]) -> (a -> a -> [a]) -> [a] -> [a]
unary_binary a -> [a]
un a -> a -> [a]
bin [a]
start = [a]
xs 
    where xs :: [a]
xs = [a] -> [a]
forall a. Ord a => [a] -> [a]
uniqs ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [a]
start [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ 
            do ( ys, z : _ ) <- [a] -> [([a], [a])]
forall a. [a] -> [([a], [a])]
splits [a]
xs
	       un z ++ do
	           ( l, r ) <- (z, z) : do y <- ys ; [ ( y, z), (z, y) ]
		   bin l r