ez-couch-0.3.0: src/EZCouch/Ids.hs
module EZCouch.Ids (generateId) where
import Data.Char
import Data.IntMap (fromList, (!))
import Data.Time.Clock.POSIX
import System.Random
import Control.Applicative
chars = ['0'..'9'] ++ ['A'..'Z'] ++ ['a'..'z']
charsLength = length chars
charsMap = fromList $ zip [0..charsLength] chars
encode = reverse . encode_
where
encode_ a
| a < charsLength = charsMap ! a : []
| otherwise = charsMap ! c : encode_ b
where
b = div a charsLength
c = mod a charsLength
getPicos = getPOSIXTime >>= return . round . (* 1000000)
getRndSuffix l = randomRIO (0, charsLength ^ l) >>= return . zeroPad l . encode
where
zeroPad l s = (replicate (l - length s) '0') ++ s
generateId = (++) <$> fmap encode getPicos <*> getRndSuffix 3
main = do
generateId >>= putStrLn
generateId >>= putStrLn
generateId >>= putStrLn
generateId >>= putStrLn