    {-# LANGUAGE LambdaCase #-}

    module Hedgehog.Classes.Common.Bottom
      ( Bottom(..), genBottom
      ) where

    import Hedgehog
    import qualified Hedgehog.Gen as Gen

    data Bottom a = BottomUndefined | BottomValue a
      deriving (Bottom a -> Bottom a -> Bool
    (Bottom a -> Bottom a -> Bool)
    -> (Bottom a -> Bottom a -> Bool) -> Eq (Bottom a)
    forall a. Eq a => Bottom a -> Bottom a -> Bool
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: forall a. Eq a => Bottom a -> Bottom a -> Bool
    == :: Bottom a -> Bottom a -> Bool
    $c/= :: forall a. Eq a => Bottom a -> Bottom a -> Bool
    /= :: Bottom a -> Bottom a -> Bool
    Eq)

    instance Show a => Show (Bottom a) where
      show :: Bottom a -> String
    show = \case
        Bottom a
    BottomUndefined -> String
    "undefined"
        BottomValue a
    a   -> a -> String
    forall a. Show a => a -> String
    show a
    a

    genBottom :: Gen a -> Gen (Bottom a)
    genBottom :: forall a. Gen a -> Gen (Bottom a)
    genBottom = (Maybe a -> Bottom a)
    -> GenT Identity (Maybe a) -> GenT Identity (Bottom a)
    forall a b. (a -> b) -> GenT Identity a -> GenT Identity b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap Maybe a -> Bottom a
    forall a. Maybe a -> Bottom a
    maybeToBottom (GenT Identity (Maybe a) -> GenT Identity (Bottom a))
    -> (Gen a -> GenT Identity (Maybe a))
    -> Gen a
    -> GenT Identity (Bottom a)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Gen a -> GenT Identity (Maybe a)
    forall (m :: * -> *) a. MonadGen m => m a -> m (Maybe a)
    Gen.maybe

    maybeToBottom :: Maybe a -> Bottom a
    maybeToBottom :: forall a. Maybe a -> Bottom a
    maybeToBottom = \case { Maybe a
    Nothing -> Bottom a
    forall a. Bottom a
    BottomUndefined; Just a
    a -> a -> Bottom a
    forall a. a -> Bottom a
    BottomValue a
    a }