X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FMisc.hs;h=4b285e4cc3b0cff1f8344aa09c905ed6b0c3fe99;hb=40a354da29b99d773fc18c4c4ad0d136a93d7264;hp=b9220cbbcefa7bf52ea9ec6c76b5f5d09467d4b6;hpb=42e5b4cc8b2dbd76ba4567b73967de974831c666;p=spline3.git diff --git a/src/Misc.hs b/src/Misc.hs index b9220cb..4b285e4 100644 --- a/src/Misc.hs +++ b/src/Misc.hs @@ -1,9 +1,15 @@ +{-# LANGUAGE BangPatterns #-} -- | The Misc module contains helper functions that seem out of place -- anywhere else. module Misc where -import Data.List (intersect) +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 (Assertion, assertEqual) +import Test.QuickCheck -- | The standard factorial function. See @@ -19,11 +25,12 @@ import Data.List (intersect) -- 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. @@ -61,17 +68,49 @@ all_equal xs = other_elements = tail xs --- | Returns 'True' if the lists xs and ys are disjoint, 'False' +-- | Returns 'True' if the vectors xs and ys are disjoint, 'False' -- otherwise. -- -- Examples: -- --- >>> disjoint [1,2,3] [4,5,6] +-- >>> let xs = Data.Vector.fromList [1,2,3] +-- >>> let ys = Data.Vector.fromList [4,5,6] +-- >>> disjoint xs ys -- True -- --- >>> disjoint [1,2,3] [3,4,5] +-- >>> let ys = Data.Vector.fromList [3,4,5] +-- >>> disjoint xs ys -- False -- -disjoint :: (Eq a) => [a] -> [a] -> Bool +disjoint :: (Eq a) => V.Vector a -> V.Vector a -> Bool disjoint xs ys = - intersect xs ys == [] + intersect xs ys == V.empty + where + intersect :: (Eq a) => V.Vector a -> V.Vector a -> V.Vector a + intersect ws zs = + V.filter (`V.elem` zs) ws + +prop_factorial_greater :: Int -> Property +prop_factorial_greater n = + n <= 20 ==> factorial n >= n + + +test_flatten1 :: Assertion +test_flatten1 = + assertEqual "flatten actually works" expected_list actual_list + where + target = [[[1::Int]], [[2, 3]]] + expected_list = [1, 2, 3] + actual_list = flatten target + + +misc_tests :: Test.Framework.Test +misc_tests = + testGroup "Misc Tests" [ + testCase "flatten (1)" test_flatten1 ] + + +misc_properties :: Test.Framework.Test +misc_properties = + testGroup "Misc Properties" [ + testProperty "factorial greater" prop_factorial_greater ]