-- | The Misc module contains helper functions that seem out of place -- anywhere else. module Misc where import Data.List (intersect) -- | The standard factorial function. See -- for -- possible improvements. -- -- Examples: -- -- >>> factorial 0 -- 1 -- -- >>> factorial 4 -- 24 -- factorial :: Int -> Int factorial n | n <= 1 = 1 | n > 20 = error "integer overflow in factorial function" | otherwise = product [1..n] -- | Takes a three-dimensional list, and flattens it into a -- one-dimensional one. -- -- Examples: -- -- >>> flatten [ [[1,2], [3,4]], [[5,6], [7,8]] ] -- [1,2,3,4,5,6,7,8] -- flatten :: [[[a]]] -> [a] flatten xs = concat $ concat xs -- | Switch the x and z dimensions of a three-dimensional list. transpose_xz :: [[[a]]] -> [[[a]]] transpose_xz [] = [] transpose_xz [[]] = [[]] transpose_xz [[[]]] = [[[]]] transpose_xz m = [[[ m !! x !! y !! z | x <- [0..xsize]] | y <- [0..ysize]] | z <- [0..zsize]] where zsize = (length m) - 1 ysize = length (head m) - 1 xsize = length (head $ head m) - 1 -- | Takes a list, and returns True if its elements are pairwise -- equal. Returns False otherwise. all_equal :: (Eq a) => [a] -> Bool all_equal xs = all (== first_element) other_elements where first_element = head xs other_elements = tail xs -- | Returns 'True' if the lists xs and ys are disjoint, 'False' -- otherwise. -- -- Examples: -- -- >>> disjoint [1,2,3] [4,5,6] -- True -- -- >>> disjoint [1,2,3] [3,4,5] -- False -- disjoint :: (Eq a) => [a] -> [a] -> Bool disjoint xs ys = intersect xs ys == []