effectful-zoo-0.0.3.0: components/hedgehog/Effectful/Zoo/Hedgehog/Api/Gen/Ulid.hs
module Effectful.Zoo.Hedgehog.Api.Gen.Ulid (
genUlid,
genUlidRandom,
genUlidTimeStamp,
) where
import Data.Binary (decodeOrFail)
import Data.ByteString.Lazy qualified as LBS
import Data.ULID (ULID (..))
import Data.ULID.Random (ULIDRandom)
import Data.ULID.TimeStamp (ULIDTimeStamp, mkULIDTimeStamp)
import Effectful.Zoo.Hedgehog.Api.Gen.Time
import HaskellWorks.Prelude
import Hedgehog
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range
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