module Autolib.Util.Closure where
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