{-# LANGUAGE CPP #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Fake.Provider.Lang
( SingleWord(..)
, capitalize
, lowerize
, Phrase
, phrase
, phraseText
) where
import Data.Bifunctor
#if MIN_VERSION_base(4,11,0)
import Data.Semigroup
#endif
import Data.String
import Data.Text (Text)
import qualified Data.Text as T
import Fake.Types
newtype SingleWord = SingleWord { unSingleWord :: Text }
#if MIN_VERSION_base(4,11,0)
deriving (Eq,Ord,Show,Semigroup,Monoid,IsString)
#else
deriving (Eq,Ord,Show,Monoid,IsString)
#endif
capitalize :: SingleWord -> SingleWord
capitalize = SingleWord .
uncurry mappend . first T.toUpper . T.splitAt 1 . unSingleWord
lowerize :: SingleWord -> SingleWord
lowerize = SingleWord .
uncurry mappend . first T.toLower . T.splitAt 1 . unSingleWord
newtype Phrase = Phrase { unPhrase :: [SingleWord] }
#if MIN_VERSION_base(4,11,0)
deriving (Eq,Ord,Show,Semigroup,Monoid)
#else
deriving (Eq,Ord,Show,Monoid)
#endif
phraseText :: Phrase -> Text
phraseText = T.unwords . map unSingleWord . unPhrase
phrase :: [FGen SingleWord] -> FGen Phrase
phrase = fmap Phrase . sequence