cleveland-0.1.1: src/Hedgehog/Gen/Michelson.hs
-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA
module Hedgehog.Gen.Michelson
( genInstrCallStack
, genLetName
, genSrcPos
, genPos
, genMText
) where
import Hedgehog (MonadGen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range
import Morley.Michelson.ErrorPos (InstrCallStack(..), LetName(..), Pos(..), SrcPos(..))
import Morley.Michelson.Text (MText, maxBoundMChar, minBoundMChar, mkMText)
genInstrCallStack :: MonadGen m => m InstrCallStack
genInstrCallStack = InstrCallStack <$> genLetCallStack <*> genSrcPos
where
genLetCallStack = Gen.frequency
[ (80, pure [])
, (18, Gen.list (Range.singleton 1) genLetName)
, (2, Gen.list (Range.singleton 2) genLetName)
]
genLetName :: MonadGen m => m LetName
genLetName = LetName <$> Gen.text (Range.linear 0 3) Gen.unicodeAll
genSrcPos :: MonadGen m => m SrcPos
genSrcPos = SrcPos <$> genPos <*> genPos
genPos :: MonadGen m => m Pos
genPos = Pos <$> Gen.word Range.linearBounded
genMText :: MonadGen m => m MText
genMText =
unsafe . mkMText <$> Gen.text
(Range.linear 0 100)
(Gen.enum (toEnum @Char minBoundMChar) (toEnum @Char maxBoundMChar))