packages feed

hw-polysemy-0.2.14.10: hedgehog/HaskellWorks/Polysemy/Hedgehog/Ulid.hs

module HaskellWorks.Polysemy.Hedgehog.Ulid (
    genUlid,
    genUlidRandom,
    genUlidTimeStamp,
) where

import           Data.Binary                         (decodeOrFail)
import qualified Data.ByteString.Lazy                as LBS
import           Data.ULID                           (ULID (..))
import           Data.ULID.Random                    (ULIDRandom)
import           Data.ULID.TimeStamp                 (ULIDTimeStamp,
                                                      mkULIDTimeStamp)
import           HaskellWorks.Polysemy.Hedgehog.Time

import           Hedgehog
import qualified Hedgehog.Gen                        as Gen
import qualified Hedgehog.Range                      as Range

import           HaskellWorks.Prelude

genUlidRandom :: Gen ULIDRandom
genUlidRandom = do
    bytes <- Gen.bytes (Range.singleton 10) -- 80 bits
    let lazyBytes = LBS.fromStrict bytes
    case decodeOrFail lazyBytes of
        Left (_, _, err)   -> fail $ "Failed to decode ULIDRandom: " <> err -- This shouldn't happen.
        Right (_, _, ulid) -> pure ulid

genUlidTimeStamp :: Gen ULIDTimeStamp
genUlidTimeStamp =
    mkULIDTimeStamp <$> genPOSIXTime

genUlid :: Gen ULID
genUlid =
    ULID <$> genUlidTimeStamp <*> genUlidRandom