{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}

module Cauldron.Args
  ( -- * Arguments
    Args,
    arg,
    runArgs,
    getArgsReps,
    contramapArgs,
    -- ** Reducing 'arg' boilerplate with 'wire'
    Wireable (wire),

    -- ** When a bean is missing
    LazilyReadBeanMissing (..),

    -- * Registrations
    -- $registrations
    Regs,
    foretellReg,
    runRegs,
    getRegsReps,

    -- ** Reducing 'foretellReg' boilerplate with 'register'
    Registrable (register),

    -- * Re-exports
    Beans,
    taste,
    fromDynList,
    SomeMonoidTypeRep,
  )
where

import Cauldron.Args.Internal
import Cauldron.Beans (Beans, SomeMonoidTypeRep (..), fromDynList, taste)