{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}

-- | Entrypoints utilities for Lorentz
module Lorentz.EntryPoints
  ( -- * Typeclasses
    EntryPointsDerivation (..)
  , ParameterHasEntryPoints (..)
  , ParameterDeclaresEntryPoints

    -- * Entrypoints API
  , AllParameterEntryPoints
  , LookupParameterEntryPoint
  , parameterEntryPointsToNotes
  , flattenEntryPoints
  , GetEntryPointArg
  , parameterEntryPointCall
  , GetDefaultEntryPointArg
  , parameterEntryPointCallDefault
  , ForbidExplicitDefaultEntryPoint
  , NoExplicitDefaultEntryPoint
  , sepcCallRootChecked
  , EntryPointRef (..)
  , eprName
  , GetEntryPointArgCustom
  , HasEntryPointArg (..)
  , HasDefEntryPointArg
  , TrustEpName (..)
  , parameterEntryPointCallCustom
  , RequireAllUniqueEntryPoints

    -- * Implementations
  , EpdNone
  , EpdPlain
  , EpdRecursive
  , EpdDelegate

    -- * Behaviour modifiers
  , ParameterWrapper (..)
  , ShouldHaveEntryPoints (..)
  ) where

import Lorentz.EntryPoints.Core
import Lorentz.EntryPoints.Helpers
import Lorentz.EntryPoints.Impl
import Lorentz.EntryPoints.Manual