]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Misc.hs
Remove all "otherwise -> error" cases for performance reasons.
[spline3.git] / src / Misc.hs
index 57dfd433e2ffc4b72cb8daa00f19f94443813404..d0eb7286559ecd0b5098fd67afd38bcbb0179e1c 100644 (file)
@@ -1,3 +1,4 @@
+{-# LANGUAGE BangPatterns #-}
 -- | The Misc module contains helper functions that seem out of place
 --   anywhere else.
 module Misc
@@ -7,7 +8,7 @@ import qualified Data.Vector as V (Vector, elem, empty, filter)
 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,11 +25,12 @@ 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 =
+  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.
@@ -58,6 +60,9 @@ transpose_xz m =
 
 -- | 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
@@ -80,6 +85,8 @@ all_equal xs =
 --   >>> 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