random-strings-0.1.0.0: src/Test/RandomStrings/FlipCase.hs
{- |
module : Test.RandomStrings.FlipCase
description : Randomly flip case of strings
A helper for randomly changing the case in strings. Useful for generating
test-cases for case-insensitive matching.
-}
module Test.RandomStrings.FlipCase
( flipCase
, flipCaseString
, randomFlipCase
, randomFlipCaseString
)
where
import Data.Bool ( bool )
import Data.Char
import Data.Ratio
import Control.Monad
import System.Random
import Test.RandomStrings.Internal
-- | Toggle the case of a @Char@.
flipCase :: Char -> Char
flipCase c
| isUpper c = toLower c
| isLower c = toUpper c
| otherwise = c
-- | Toggle character case for a @String@.
flipCaseString :: String -> String
flipCaseString = map flipCase
-- | Randomly flip the case of a @Char@.
randomFlipCase
:: Rational -- ^ range 0 to 1; chance of flipping case
-> Char -- ^ @Char@ to flip
-> IO Char
randomFlipCase r c = randomBool r >>= bool (return c) (return $ flipCase c)
-- | Randomly flip the case of a @String@.
randomFlipCaseString
:: Rational -- ^ range 0 to 1; chance of flipping case
-> String -- ^ original @String@
-> IO String
randomFlipCaseString r = mapM (randomFlipCase r)