smallcheck-series-0.2: Test/SmallCheck/Series/ByteString/Lazy.hs
{-|
Following the convention from "Data.ByteString.Lazy", this module is intended to be
imported @qualified@. For example:
> import qualified Test.SmallCheck.Series.ByteString.Lazy as L.Series
-}
module Test.SmallCheck.Series.ByteString.Lazy
(
-- * Replication
replicateA
, replicate0
, replicateW8
-- * Enumeration
, enumW8s
, enumAlphabet
, enumList
-- * Printing
, jack
) where
import Data.Char (ord)
import Data.List (inits)
import Data.Word (Word8)
import Data.ByteString.Lazy (ByteString, pack)
import qualified Data.ByteString.Lazy.Char8 as L8 (pack)
import Test.SmallCheck.Series
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows by replicating
-- the @97@ 'Word8', which encodes the 'a' 'Char' in @ASCII@.
--
-- >>> list 4 replicateA
-- ["","a","aa","aaa","aaaa"]
--
-- Use this when you don't care about the 'Word8' inside 'Data.ByteString.Lazy.ByteString'.
replicateA :: Series m ByteString
replicateA = replicateW8 97
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows by replicating
-- the @0@ 'Word8'.
--
-- >>> list 4 replicate0
-- ["","\NUL","\NUL\NUL","\NUL\NUL\NUL","\NUL\NUL\NUL\NUL"]
replicate0 :: Series m ByteString
replicate0 = replicateW8 0
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows by replicating
-- the given 'Word8'.
--
-- >>> list 4 $ replicateW8 64
-- ["","@","@@","@@@","@@@@"]
replicateW8 :: Word8 -> Series m ByteString
replicateW8 b =
generate $ \d -> fmap pack . inits $ (replicate . fromIntegral) d b
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows by enumerating
-- every 'Word8'.
--
-- >>> list 4 enumW8s
-- ["","\NUL","\NUL\SOH","\NUL\SOH\STX","\NUL\SOH\STX\ETX"]
enumW8s :: Series m ByteString
enumW8s = enumList [0..255]
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows by enumerating
-- the 'Word8's which encode the latin alphabet in @ASCII@.
--
-- >>> list 4 enumAlphabet
-- ["","a","ab","abc","abcd"]
enumAlphabet :: Series m ByteString
enumAlphabet = enumList $ fmap (fromIntegral . ord) ['a'..'z']
-- | A 'Data.ByteString.ByteString' 'Series' that grows by enumerating
-- every 'Word8' in the given list.
--
-- >>> list 4 . enumList $ fmap (fromIntegral . ord) "abc"
-- ["","a","ab","abc"]
enumList :: [Word8] -> Series m ByteString
enumList cs = generate $ \d -> fmap pack . inits $ take d cs
-- | A 'Data.ByteString.Lazy.ByteString' 'Series' that grows with @ASCII@
-- dummy English words encoded in @ASCII@.
--
-- This is useful when you want to print 'Series'.
--
-- >>> let s = list 20 jack
-- >>> take 3 s
-- ["","All","All work"]
-- >>> last s
-- "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy."
jack :: Series m ByteString
jack = generate $ \d ->
fmap (L8.pack . unwords) . inits . take d . cycle . words $
"All work and no play makes Jack a dull boy."