Unique 0.4.5 → 0.4.6
raw patch · 7 files changed
+243/−51 lines, 7 filesdep +QuickCheckdep +Uniquedep +hspecdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: QuickCheck, Unique, hspec
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- Data/List/Unique.hs +9/−4
- Unique.cabal +25/−47
- tests/Complex.hs +26/−0
- tests/IsUnique.hs +74/−0
- tests/Main.hs +8/−0
- tests/RepeatedBy.hs +57/−0
- tests/SortUniq.hs +44/−0
Data/List/Unique.hs view
@@ -148,10 +148,15 @@ -- isUnique :: Eq a => a -> [a] -> Maybe Bool-isUnique x = checkNumber . countElem x- where checkNumber 0 = Nothing- checkNumber 1 = Just True- checkNumber _ = Just False+isUnique a = go Nothing a+ where go s _ [] = s+ go s@Nothing x (z:zs)+ | x == z = go (Just True) x zs+ | otherwise = go s x zs+ go s@(Just True) x (z:zs)+ | x == z = Just False+ | otherwise = go s x zs+ go s@(Just False) _ _ = s -- | 'isRepeated' is a reverse function to 'isUnique' --
Unique.cabal view
@@ -1,72 +1,50 @@--- Initial Unique.cabal generated by cabal init. For further--- documentation, see http://haskell.org/cabal/users-guide/---- The name of the package. name: Unique --- The package version. See the Haskell package versioning policy (PVP)--- for standards guiding when and how versions should be incremented.--- http://www.haskell.org/haskellwiki/Package_versioning_policy--- PVP summary: +-+------- breaking API changes--- | | +----- non-breaking API additions--- | | | +--- code changes with no API change-version: 0.4.5---- A short (one-line) description of the package.-synopsis: It provides the functionality like unix "uniq" utility---- A longer description of the package.-description: Library provides the functions to find unique and duplicate elements in the list+version: 0.4.6 --- The license under which the package is released.+synopsis: It provides the functionality like unix "uniq" utility+description: Library provides the functions to find unique and duplicate elements in the list license: BSD3---- The file containing the license text. license-file: LICENSE---- The package author(s). author: Volodymyr Yaschenko---- An email address to which users can send suggestions, bug reports, and--- patches. maintainer: ualinuxcn@gmail.com- category: Data- build-type: Simple---- Extra files to be distributed with the package, such as examples or a--- README.--- extra-source-files:---- Constraint on the version of Cabal needed to build this package. cabal-version: >=1.10 source-repository head- type: darcs- location: http://hub.darcs.net/kapral/Unique/+ type: darcs+ location: http://hub.darcs.net/kapral/Unique/ library- -- Modules exported by the library. exposed-modules: Data.List.Unique, Data.List.UniqueStrict, Data.List.UniqueUnsorted - -- Modules included in this library but not exported.- -- other-modules:-- -- LANGUAGE extensions used by modules in this package.- -- other-extensions:-- -- Other library packages from which modules are imported. build-depends: base >=4.0 && < 5 , extra , containers , hashable , unordered-containers- -- Directories containing source files.- -- hs-source-dirs:+ default-language: Haskell2010+ ghc-options: -Wall -O2 - -- Base language which the package is written in.++Test-Suite HspecTest+ type: exitcode-stdio-1.0+ hs-source-dirs: tests+ main-is: Main.hs+ other-modules: Complex+ , IsUnique+ , RepeatedBy+ , SortUniq++ build-depends: base >=4.8 && <4.9+ , hspec+ , containers+ , QuickCheck+ , Unique+ default-language: Haskell2010- ghc-options: -Wall+ ghc-options: -Wall -O2+
+ tests/Complex.hs view
@@ -0,0 +1,26 @@+module Complex where++import Test.Hspec+import Test.QuickCheck++import Data.List.Unique+import Data.List (sort)+++triplet :: (a -> b) -> (a, a, a) -> (b, b, b)+triplet f (x, y, z) = (f x, f y, f z)++complexTests :: SpecWith ()+complexTests =+ describe "Data.List.Unique.complex" $ do+ + it "complex: should return ([],[],[]) with empty list" $ do+ complex ( [] :: [Int] ) `shouldBe` ([],[],[])++ it "complex: simple test" $ do+ complex "This is the test line" `shouldBe` ("This teln","is hte","Tln")++ it "complex: returns the same result as `sortUniq`, `repeated`, `unique` but not sorted" $+ property $+ \ xs -> triplet sort ( complex (xs :: String) )+ == (sortUniq xs, repeated xs, unique xs)
+ tests/IsUnique.hs view
@@ -0,0 +1,74 @@+module IsUnique where++import Test.Hspec+import Test.QuickCheck+import Control.Exception (evaluate)+import Data.Maybe (isJust, isNothing)++import Data.List.Unique++isUniqueTests :: SpecWith ()+isUniqueTests =+ describe "Data.List.Unique.isUnique" $ do+ it "isUnique should return Nothing with empty list" $ do+ isUnique (1 :: Int) [] + `shouldBe`+ Nothing++ it "isUnique should return Nothing with empty list (quickCheck)" $+ property $+ \x -> isNothing $ isUnique (x :: Char) []++ it "isUnique, returns (Just True) when element is unique" $ do+ isUnique 'a' "foo bar" `shouldBe` Just True++ it "isUnique , returns (Just False) when list has duplicate of element" $ do+ isUnique 'o' "foo bar" `shouldBe` Just False++ it "isUnique is a lazy function, 'undefined test'" $ do+ isUnique 'g' ['g','a','g', undefined ]+ `shouldBe`+ Just False++ it "isUnique is a lazy function, 'undefined test'. Generates exeption" $ do+ evaluate (isUnique 't' ['t', 'd', undefined] )+ `shouldThrow`+ errorCall "Prelude.undefined"++ it "isRepeated is a lazy function too, 'undefined test'" $ do+ isRepeated 'g' ['g','a','g', undefined ]+ `shouldBe`+ Just True++ it "isRepeated is reverse function to isUnique" $ do+ property $+ \ x xs+ -> isUnique (x :: Int) xs == fmap not (isRepeated x xs)++ it "isUnique should return (Just ANY) when element is exist in the list" $+ property $+ \ ( NonEmpty ls@(x:xs) )+ -> not (null xs)+ ==> isJust (isUnique (x :: Char) ls)++ context "isUnique should return (Just False) when at least two elements are exist in the list" $+ it "- It checks laziness as well" $+ property $+ \ ( NonEmpty ls@(x:xs) )+ -> not (null xs)+ ==> isJust $ isUnique (x :: Char) (ls ++ [x, undefined])++ it "isUnique should return Nothing when element is absent in the list" $+ property $+ \ x xs+ -> notElem x xs+ ==> isNothing (isUnique (x :: Char) xs)+ + it "isUnique and isRepeated should return Nothing when element is absent in the list" $+ property $+ \ x xs+ -> notElem x xs+ ==> isNothing (isUnique (x :: Char) xs)+ && isNothing (isRepeated x xs)++
+ tests/Main.hs view
@@ -0,0 +1,8 @@+import IsUnique+import SortUniq+import RepeatedBy+import Complex+import Test.Hspec++main :: IO ()+main = mapM_ hspec [isUniqueTests, sortUniqTests, repeatedByTests, complexTests]
+ tests/RepeatedBy.hs view
@@ -0,0 +1,57 @@+module RepeatedBy where++import Test.Hspec+import Test.QuickCheck++import Data.List.Unique+import Data.List (sort, group)+++repeatedByTests :: SpecWith ()+repeatedByTests =+ describe "Data.List.Unique.repeatedBy,repeated,unique" $ do+ + it "repeatedBy: should return [] with empty list" $ do+ repeatedBy (>100) ( [] :: [Int] ) `shouldBe` []++ it "repeatedBy: simple test" $ do+ repeatedBy (>2) "This is the test line" `shouldBe` " eist"++ it "repeatedBy: returns [] when predicate (=< negative) " $+ property $+ \x xs -> x < 0+ ==> null ( repeatedBy (<= x) (xs :: String) )++ it "repeatedBy: removes the duplicated elements like `sortUniq` function when predicate (>= negative)" $+ property $+ \ x xs -> x < 0+ ==> repeatedBy (>= x) (xs :: String) == sortUniq xs++ it "repeatedBy: returns [] when preficate (== 0)" $+ property $+ \ xs -> null ( repeatedBy (== 0) (xs :: [Int]) )++ it "repeatedBy: returns sorted result" $+ property $+ \x xs -> x > 0+ ==> repeatedBy (> x) (xs :: String) == sort (repeatedBy (> x) xs)++ it "repeatedBy: resulted elements should occur only once" $+ property $+ \ x xs -> x > 0+ ==> all (==1) . map length . group $ repeatedBy (> x) ( xs :: String )++ it "unique: simple test" $ do+ unique "foo bar" `shouldBe` " abfr"++ it "repeated: simple test" $ do+ repeated "foo bar" `shouldBe` "o"++ it "unique: multiple execution should return the same result" $+ property $+ \ xs -> unique (xs :: String) == unique (unique xs)++ it "repeated && unique: should return different result on the same non empty list" $+ property $+ \ xs -> not (null xs)+ ==> repeated (xs :: String) /= unique xs
+ tests/SortUniq.hs view
@@ -0,0 +1,44 @@+module SortUniq where++import Test.Hspec+import Test.QuickCheck++import Data.List.Unique+import Data.List (sort, group)+import Data.Set (fromList, toList)+++sortUniqTests :: SpecWith ()+sortUniqTests =+ describe "Data.List.Unique.sortUniq" $ do+ + it "sortUniq: should return [] with empty list" $ do+ sortUniq ( [] :: [Int] ) `shouldBe` []++ it "sortUniq: simple test" $ do+ sortUniq "foo bar" `shouldBe` " abfor"++ it "sortUniq: multiple execution should return the same result" $+ property $+ \ xs -> sortUniq (sortUniq ( xs :: String) ) == sortUniq xs++ it "sortUniq: the result has to be sorted" $+ property $+ \ xs -> sortUniq ( xs :: [Int] ) == sort (sortUniq xs)++ it "sortUniq: elements should occur only once" $+ property $+ \ ( NonEmpty ls@(x:_) ) -> isUnique (x :: Float) (sortUniq ls) == Just True++ it "sortUniq: elements should occur only once #2" $+ property $+ \ xs -> all (==1) . map length . group $ sortUniq ( xs :: [Integer] )++ it "sortUniq: check if it's correct by slow analog function" $+ property $+ \ xs -> ( map head . group . sort $ (xs :: String) )+ == sortUniq xs++ it "sortUniq: check if it's correct by the Faster analog function :)" $+ property $+ \ xs -> sortUniq ( xs :: String ) == toList (fromList xs)