packages feed

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