module Utility where import Data.List --if any of the predicates returns true, options returns true options :: [a -> Bool] -> a -> Bool options l x = any id [f x | f <- l] fixpoint :: (Eq a) => (a -> a) -> a -> a fixpoint f x = let fx = f x in if fx == x then x else fixpoint f fx setcompareBy :: (a -> a -> Bool) -> [a] -> [a] -> Bool setcompareBy _ [] [] = True setcompareBy _ [] _ = False setcompareBy _ _ [] = False setcompareBy p a@(x:xs) b = length a == length b && setcompareBy p xs (deleteBy p x b) deleteIndex :: Int -> [a] -> [a] deleteIndex 0 (_:xs) = xs deleteIndex i (x:xs) | i > 0 = x : deleteIndex (i-1) xs | otherwise = error "Negative index in deleteIndex" deleteIndex _ [] = error "Too high index in deleteIndex" fromLeft :: Either a b -> a fromLeft (Left a) = a fromLeft (Right _) = undefined fromRight :: Either a b -> b fromRight (Left _) = undefined fromRight (Right b) = b