module Tendermint.SDK.BaseApp
  ( -- * BaseApp
    BaseAppEffs
  , (:&)
  , BaseApp
  , ScopedBaseApp
  , compileToCoreEffs
  , compileScopedEff

  -- * CoreEff
  , CoreEffs
  , Context(..)
  , contextLogConfig
  , contextPrometheusEnv
  , contextAuthTree
  , makeContext
  , runCoreEffs

  -- * Store
  , RawStore
  , RawKey(..)
  , IsKey(..)
  , StoreKey(..)
  , put
  , get
  , delete

  -- * Query Routes
  , Leaf
  , QA

  -- * Scope
  , ConnectionScope(..)
  , applyScope

  -- * Errors
  , AppError(..)
  , IsAppError(..)
  , SDKError(..)
  , throwSDKError

  -- * Events
  , Event(..)
  , ToEvent(..)
  , ContextEvent(..)
  , emit
  , logEvent

  -- * Gas
  , GasMeter

  -- * Logger
  , Logger
  , Tendermint.SDK.BaseApp.Logger.log
  , addContext
  , LogSelect(..)
  , Severity(..)
  , Select(..)
  , Verbosity(..)

  -- * Metrics
  , Metrics
  , incCount
  , withTimer
  , CountName(..)
  , HistogramName(..)

  -- * Transaction
  , TransactionApplication
  , RoutingTx(..)
  , RouteContext(..)
  , RouteTx
  , Return
  , (:~>)
  , TypedMessage
  , TxEffs
  , EmptyTxServer
  , emptyTxServer
  , serveTxApplication
  , DefaultCheckTx(..)

  -- * Query
  , Queryable(..)
  , FromQueryData(..)
  , QueryApi
  , RouteQ
  , QueryResult(..)
  , storeQueryHandlers
  , serveQueryApplication
  , EmptyQueryServer
  , emptyQueryServer

  ) where

import           Tendermint.SDK.BaseApp.BaseApp
import           Tendermint.SDK.BaseApp.CoreEff
import           Tendermint.SDK.BaseApp.Errors
import           Tendermint.SDK.BaseApp.Events
import           Tendermint.SDK.BaseApp.Gas
import           Tendermint.SDK.BaseApp.Logger
import           Tendermint.SDK.BaseApp.Metrics
import           Tendermint.SDK.BaseApp.Query
import           Tendermint.SDK.BaseApp.Store
import           Tendermint.SDK.BaseApp.Transaction
import           Tendermint.SDK.Types.Effects       ((:&))