module Autolib.Util.Fix where

-- -- $Id$

fixBy :: Eq b => (a -> b) -> (a -> a) -> a -> a
fixBy :: forall b a. Eq b => (a -> b) -> (a -> a) -> a -> a
fixBy a -> b
select a -> a
f a
x0 = [a] -> a
forall a. HasCallStack => [a] -> a
last ([a] -> a) -> [a] -> a
forall a b. (a -> b) -> a -> b
$ (a -> b) -> (a -> a) -> a -> [a]
forall b a. Eq b => (a -> b) -> (a -> a) -> a -> [a]
fixesBy a -> b
select a -> a
f a
x0

fix :: Eq a => (a -> a) -> a -> a
fix :: forall a. Eq a => (a -> a) -> a -> a
fix = (a -> a) -> (a -> a) -> a -> a
forall b a. Eq b => (a -> b) -> (a -> a) -> a -> a
fixBy a -> a
forall a. a -> a
id

fixesBy :: Eq b => (a -> b) -> (a -> a) -> a -> [a]
fixesBy :: forall b a. Eq b => (a -> b) -> (a -> a) -> a -> [a]
fixesBy a -> b
select a -> a
f a
x0 = a
x0 a -> [a] -> [a]
forall a. a -> [a] -> [a]
: 
    let x1 :: a
x1 = a -> a
f a
x0
    in	if a -> b
select a
x1 b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== a -> b
select a
x0 then [] 
	else (a -> b) -> (a -> a) -> a -> [a]
forall b a. Eq b => (a -> b) -> (a -> a) -> a -> [a]
fixesBy a -> b
select a -> a
f a
x1

fixes :: Eq a => (a -> a) -> a -> [a]
fixes :: forall a. Eq a => (a -> a) -> a -> [a]
fixes = (a -> a) -> (a -> a) -> a -> [a]
forall b a. Eq b => (a -> b) -> (a -> a) -> a -> [a]
fixesBy a -> a
forall a. a -> a
id

fixLBy :: Eq b => (a -> b) -> [a] -> [a]
fixLBy :: forall b a. Eq b => (a -> b) -> [a] -> [a]
fixLBy a -> b
select (a
x:a
y:[a]
rest) | a -> b
select a
x b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== a -> b
select a
y = [a
x]
			 | Bool
otherwise            = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> b) -> [a] -> [a]
forall b a. Eq b => (a -> b) -> [a] -> [a]
fixLBy a -> b
select (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
rest)
fixLBy a -> b
_ [a]
xs = [a]
xs

fixL :: Eq a => [a] -> [a]
fixL :: forall a. Eq a => [a] -> [a]
fixL = (a -> a) -> [a] -> [a]
forall b a. Eq b => (a -> b) -> [a] -> [a]
fixLBy a -> a
forall a. a -> a
id