module Fix where

import List (genericIndex)

-- usual fixed points
fix :: (a -> a) -> a                        
fix f = let a = f a in a    
   
-- approximations to fix
nthFix :: Integer -> (a -> a) -> a       
nthFix n f = genericIndex (iterate f undefined) n
                 
-- traces
traceFix :: ((a, u) -> (b, u)) -> a -> b       
traceFix f a = let (b, u) = f (a, u) in b    

-- parameterized fix
paramFix :: ((a, u) -> u) -> a -> u           
paramFix f a = let u = f (a, u) in u
