ListLike 4.0.2 → 4.1.0
raw patch · 7 files changed
+175/−15 lines, 7 filesdep +dlistdep +fmlistdep ~base
Dependencies added: dlist, fmlist
Dependency ranges changed: base
Files
- ListLike.cabal +14/−8
- README.md +6/−4
- src/Data/ListLike.hs +2/−0
- src/Data/ListLike/DList.hs +48/−0
- src/Data/ListLike/FMList.hs +69/−0
- src/Data/ListLike/Vector.hs +2/−2
- testsrc/TestInfrastructure.hs +34/−1
ListLike.cabal view
@@ -1,5 +1,5 @@ Name: ListLike-Version: 4.0.2+Version: 4.1.0 License: BSD3 Maintainer: John Lato <jwlato@gmail.com> Author: John Goerzen@@ -25,13 +25,13 @@ Library Hs-Source-Dirs: src- Exposed-Modules: Data.ListLike,- Data.ListLike.Base,- Data.ListLike.CharString,- Data.ListLike.FoldableLL,- Data.ListLike.IO,- Data.ListLike.Instances,- Data.ListLike.String,+ Exposed-Modules: Data.ListLike+ Data.ListLike.Base+ Data.ListLike.CharString+ Data.ListLike.FoldableLL+ Data.ListLike.IO+ Data.ListLike.Instances+ Data.ListLike.String Data.ListLike.Text Data.ListLike.Text.Text Data.ListLike.Text.TextLazy@@ -41,6 +41,8 @@ Data.ListLike.Vector.Storable Data.ListLike.Vector.Unboxed Data.ListLike.Vector.Vector+ Data.ListLike.DList+ Data.ListLike.FMList -- Other-Modules: Data.ConfigFile.Lexer Build-Depends: base >= 3 && < 5 ,containers >= 0.3 && < 0.6@@ -48,6 +50,8 @@ ,array >= 0.3 && < 0.6 ,text >= 0.11 && < 1.2 ,vector >= 0.5 && < 0.11+ ,dlist >= 0.7 && < 0.9+ ,fmlist >= 0.8 && < 0.9 Test-suite listlike-tests Hs-source-dirs: src testsrc@@ -63,6 +67,8 @@ ,array ,bytestring ,containers+ ,dlist+ ,fmlist ,text ,vector
README.md view
@@ -3,16 +3,18 @@ ListLike ======== -The ListLike package provides typeclasses and instances to allow+The `ListLike` package provides typeclasses and instances to allow polymorphism over many common datatypes. Installation ------------ -The package can be built/installed with Cabal. If you have cabal-install,-simply run "cabal install ListLike" to install the package. Without-cabal-install, execute the following commands:+The package can be built/installed with Cabal. If you have `cabal-install`,+simply run `cabal install ListLike` to install the package. Without+`cabal-install`, execute the following commands: +``` $ runghc Setup.hs configure $ runghc Setup.hs build $ runghc Setup.hs install+```
src/Data/ListLike.hs view
@@ -121,6 +121,8 @@ import Data.ListLike.CharString import Data.ListLike.FoldableLL import Data.ListLike.Instances()+import Data.ListLike.DList+import Data.ListLike.FMList import Data.ListLike.String import Data.ListLike.Utils import Data.ListLike.IO
+ src/Data/ListLike/DList.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses, FlexibleInstances #-}+-- | 'Data.ListLike.ListLike' instances for 'Data.DList.DList'+module Data.ListLike.DList () where+import qualified Prelude as P+import Data.ListLike.Base+import Data.ListLike.FoldableLL+import Data.ListLike.IO+import Data.ListLike.String+import Data.DList (DList(..))+import qualified Data.DList as D+import Data.Foldable (Foldable)+import qualified Data.Foldable as F+import Data.Traversable (Traversable)+import qualified Data.Traversable as T+import Data.String (IsString)+import qualified Data.String as S+import Control.Category+import Data.Char (Char(..))++instance FoldableLL (DList a) a where+ foldl = F.foldl+ foldr = D.foldr+ foldl1 = F.foldl1+ foldr1 = F.foldr1+ foldl' = F.foldl'+ foldr' = F.foldr'++instance ListLike (DList a) a where+ empty = D.empty+ singleton = D.singleton+ cons = D.cons+ snoc = D.snoc+ append = D.append+ head = D.head+ tail = D.tail+ rigidMap = D.map+ null = null . D.toList+ toList = D.toList+ fromList = D.fromList+ replicate = D.replicate++instance StringLike (DList Char) where+ toString = D.toList+ fromString = D.fromList+ lines = map D.fromList . S.lines . D.toList+ words = map D.fromList . S.words . D.toList+ unlines = D.fromList . S.unlines . map D.toList+ unwords = D.fromList . S.unwords . map D.toList
+ src/Data/ListLike/FMList.hs view
@@ -0,0 +1,69 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}+-- | 'Data.ListLike.ListLike' instances for 'Data.FMList.FMList'+module Data.ListLike.FMList () where+import qualified Prelude as P+import Data.ListLike.Base+import Data.ListLike.FoldableLL+import Data.ListLike.IO+import Data.ListLike.String+import Data.FMList (FMList(..))+import qualified Data.FMList as FM+import Data.Foldable (Foldable)+import qualified Data.Foldable as F+import Data.Traversable (Traversable)+import qualified Data.Traversable as T+import Data.String (IsString)+import qualified Data.String as S+import Control.Monad.Zip (MonadZip)+import qualified Control.Monad.Zip as Z+import Data.Function+import Data.Char (Char(..))++instance FoldableLL (FMList a) a where+ foldl = F.foldl+ foldr = F.foldr+ foldl1 = F.foldl1+ foldr1 = F.foldr1+ foldl' = F.foldl'+ foldr' = F.foldr'++instance ListLike (FMList a) a where+ empty = FM.empty+ singleton = FM.singleton+ cons = FM.cons+ snoc = FM.snoc+ append = FM.append+ head = FM.head+ tail = FM.tail+ last = FM.last+ init = FM.init+ fromList = FM.fromList+ toList = FM.toList+ null = FM.null+ genericLength = FM.genericLength+ length = FM.length+ reverse = FM.reverse+ filter = FM.filter+ take = FM.take+ takeWhile = FM.takeWhile+ drop = FM.drop+ dropWhile = FM.dropWhile++instance InfiniteListLike (FMList a) a where+ iterate = FM.iterate+ repeat = FM.repeat+ cycle a = (a `FM.append` cycle a) `FM.append` a++instance IsString (FMList Char) where+ fromString = FM.fromList++instance StringLike (FMList Char) where+ fromString = FM.fromList+ toString = FM.toList+ lines = map FM.fromList . S.lines . FM.toList+ words = map FM.fromList . S.words . FM.toList+ unlines = FM.fromList . S.unlines . map FM.toList+ unwords = FM.fromList . S.unwords . map FM.toList++instance MonadZip FMList where+ mzipWith = FM.zipWith
src/Data/ListLike/Vector.hs view
@@ -1,5 +1,5 @@--- | ListLike instances for several @Data.Vector@ types.--- The `Data.ListLike.Vector.Generic` instances are not exported from this+-- | 'Data.ListLike.ListLike' instances for several @Data.Vector@ types.+-- The @Data.ListLike.Vector.Generic@ instances are not exported from this -- module in order to prevent collisions. -- module Data.ListLike.Vector (
testsrc/TestInfrastructure.hs view
@@ -25,6 +25,8 @@ import qualified Data.ByteString.Lazy as BSL import qualified Data.ListLike as LL import qualified Data.Array as A+import qualified Data.DList as DL+import qualified Data.FMList as FM import qualified Data.Sequence as S import qualified Data.Foldable as F import qualified Data.Text as T@@ -36,10 +38,16 @@ import System.IO import qualified Test.HUnit as HU import Text.Printf+import Data.Function (on) import Data.Word import Data.List import Data.Monoid +simpleArb :: (LL.ListLike f i, Arbitrary i) => Gen f+simpleArb = sized (\n -> choose (0, n) >>= myVector)+ where myVector n = do+ arblist <- vector n+ return (LL.fromList arblist) instance (Arbitrary i) => Arbitrary (MyList i) where arbitrary = sized (\n -> choose (0, n) >>= myVector)@@ -51,6 +59,20 @@ instance (CoArbitrary i) => CoArbitrary (MyList i) where coarbitrary l = coarbitrary (LL.toList l) +instance (Arbitrary i) => Arbitrary (DL.DList i) where+ arbitrary = simpleArb+ shrink = map LL.fromList . shrink . LL.toList++instance (CoArbitrary i) => CoArbitrary (DL.DList i) where+ coarbitrary l = coarbitrary (LL.toList l)++instance (Arbitrary i) => Arbitrary (FM.FMList i) where+ arbitrary = simpleArb+ shrink = map LL.fromList . shrink . LL.toList++instance (CoArbitrary i) => CoArbitrary (FM.FMList i) where+ coarbitrary l = coarbitrary (LL.toList l)+ instance (Arbitrary i) => Arbitrary (S.Seq i) where arbitrary = sized (\n -> choose (0, n) >>= myVector) where myVector n =@@ -150,8 +172,12 @@ instance (Arbitrary a, Show a, Eq a) => TestLL [a] a where -instance (Arbitrary a, Show a, Eq a) => TestLL (MyList a) a where+instance (Arbitrary a, Show a, Eq a) => TestLL (MyList a) a +instance (Arbitrary a, Show a, Eq a) => TestLL (DL.DList a) a++instance (Arbitrary a, Show a, Eq a) => TestLL (FM.FMList a) a+ instance TestLL BS.ByteString Word8 where instance TestLL BSL.ByteString Word8 where@@ -170,6 +196,9 @@ instance (Arbitrary a, Show a, Eq a, VU.Unbox a) => TestLL (VU.Vector a) a where +instance Eq a => Eq (FM.FMList a) where+ (==) = (==) `on` FM.toList+ mapRemoveDups :: (Eq k1) => [(k1, v1)] -> [(k1, v1)] mapRemoveDups = nubBy (\(k1, _) (k2, _) -> k1 == k2) @@ -266,6 +295,8 @@ w "Array Int Int" (x::LLTest (A.Array Int Int) Int), w "Array Int Bool" (x::LLTest (A.Array Int Bool) Bool), w "Array (Just Int)" (x::LLTest (A.Array Int (Maybe Int)) (Maybe Int)),+ w "DList Int" (x::LLTest (DL.DList Int) Int),+ -- w "FMList Int" (x::LLTest (FM.FMList Int) Int), w "Vector Int" (x::LLTest (V.Vector Int) Int), w "StorableVector Int" (x::LLTest (VS.Vector Int) Int), w "UnboxVector Int" (x::LLTest (VU.Vector Int) Int),@@ -282,6 +313,8 @@ [w "String" (x::LLTest String Char), w "MyList Char" (x::LLTest (MyList Char) Char), w "Sequence Char" (x::LLTest (S.Seq Char) Char),+ w "DList Char" (x::LLTest (DL.DList Char) Char),+ -- w "FMList Char" (x::LLTest (FM.FMList Char) Char), w "ByteString" (x::LLTest BS.ByteString Word8), w "ByteString.Lazy" (x::LLTest BSL.ByteString Word8), w "Array Int Char" (x::LLTest (A.Array Int Char) Char),