module Web.Cuid (
Cuid, newCuid,
Slug, newSlug
) where
import Control.Monad (liftM)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.String (fromString)
import Data.Text (Text)
import Formatting (sformat)
import Data.Monoid (Monoid, (<>))
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (mconcat)
#endif
import Web.Cuid.Internal
type Cuid = Text
newCuid :: MonadIO m => m Cuid
newCuid = concatResults [c, time, count, fingerprint, random, random] where
c = return (fromString "c")
time = liftM (sformat number) getTimestamp
count = liftM (sformat numberPadded) getNextCount
fingerprint = do
(pid, host) <- getFingerprint
return (sformat twoOfNum pid <> sformat twoOfNum host)
random = liftM (sformat numberPadded) getRandomValue
type Slug = Text
newSlug :: MonadIO m => m Slug
newSlug = concatResults [time, count, fingerprint, random] where
time = liftM (sformat twoOfNum) getTimestamp
count = liftM (sformat numberPadded) getNextCount
random = liftM (sformat twoOfNum) getRandomValue
fingerprint = do
(pid, host) <- getFingerprint
return (sformat firstOfNum pid <> sformat lastOfNum host)
concatResults :: (MonadIO m, Monoid a) => [IO a] -> m a
concatResults actions = liftM mconcat (liftIO $ sequence actions)