+{-# LANGUAGE BangPatterns #-}
-- | The Misc module contains helper functions that seem out of place
-- anywhere else.
module Misc
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.Framework.Providers.QuickCheck2 (testProperty)
-import Test.HUnit
+import Test.HUnit (Assertion, assertEqual)
import Test.QuickCheck
-- 24
--
factorial :: Int -> Int
-factorial n
- | n <= 1 = 1
- | n > 20 = error "integer overflow in factorial function"
- | otherwise = product [1..n]
-
+factorial !n
+ | n > 20 = error "integer overflow in factorial function"
+ | otherwise = go 1 n
+ where go !acc !i
+ | i <= 1 = acc
+ | otherwise = go (acc * i) (i - 1)
-- | Takes a three-dimensional list, and flattens it into a
-- one-dimensional one.
-- | Takes a list, and returns True if its elements are pairwise
-- equal. Returns False otherwise.
+--
+-- Only used in tests.
+--
all_equal :: (Eq a) => [a] -> Bool
all_equal xs =
all (== first_element) other_elements
-- >>> disjoint xs ys
-- False
--
+-- Only used in tests.
+--
disjoint :: (Eq a) => V.Vector a -> V.Vector a -> Bool
disjoint xs ys =
intersect xs ys == V.empty