{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}

-- |
-- Module      :   Grisette.Core.BuiltinUnionWrapper
-- Copyright   :   (c) Sirui Lu 2021-2023
-- License     :   BSD-3-Clause (see the LICENSE file)
--
-- Maintainer  :   siruilu@cs.washington.edu
-- Stability   :   Experimental
-- Portability :   GHC only
module Grisette.Core.BuiltinUnionWrappers
  ( -- * Builtin constructor wrappers for some common data types
    mrgTrue,
    mrgFalse,
    mrgUnit,
    mrgTuple2,
    mrgTuple3,
    mrgJust,
    mrgNothing,
    mrgLeft,
    mrgRight,
    mrgInL,
    mrgInR,
    mrgAssertionViolation,
    mrgAssumptionViolation,
  )
where

import Data.Functor.Sum (Sum)
import Grisette.Core.Control.Exception (VerificationConditions)
import Grisette.Core.Data.Class.SimpleMergeable (mrgSingle)
import Grisette.Core.TH (makeUnionWrapper, makeUnionWrapper')

$(makeUnionWrapper "mrg" ''Bool)
$(makeUnionWrapper' ["mrgUnit"] ''())
$(makeUnionWrapper' ["mrgTuple2"] ''(,))
$(makeUnionWrapper' ["mrgTuple3"] ''(,,))
$(makeUnionWrapper "mrg" ''Maybe)
$(makeUnionWrapper "mrg" ''Either)
$(makeUnionWrapper "mrg" ''Sum)
$(makeUnionWrapper "mrg" ''VerificationConditions)