-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Address in Tezos.

module Hedgehog.Gen.Tezos.Address
  ( genAddress
  , genContractAddress
  , genKeyAddress
  ) where

import Hedgehog (MonadGen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range

import Hedgehog.Gen.Tezos.Crypto (genKeyHash)
import Morley.Tezos.Address (Address(..), ContractHash(..))

genAddress :: MonadGen m => m Address
genAddress :: m Address
genAddress = [m Address] -> m Address
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice [m Address
forall (m :: * -> *). MonadGen m => m Address
genKeyAddress, m Address
forall (m :: * -> *). MonadGen m => m Address
genContractAddress]

genKeyAddress :: MonadGen m => m Address
genKeyAddress :: m Address
genKeyAddress = KeyHash -> Address
KeyAddress (KeyHash -> Address) -> m KeyHash -> m Address
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m KeyHash
forall (m :: * -> *). MonadGen m => m KeyHash
genKeyHash

genContractAddress :: MonadGen m => m Address
genContractAddress :: m Address
genContractAddress = ContractHash -> Address
ContractAddress (ContractHash -> Address)
-> (ByteString -> ContractHash) -> ByteString -> Address
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ContractHash
ContractHash (ByteString -> Address) -> m ByteString -> m Address
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
Gen.bytes (Int -> Range Int
forall a. a -> Range a
Range.singleton Int
20)