module Control.Static
  (
  -- * Common definitions
    TCTab(..)
  -- * Static keys and values
  , SKey
  , SKeyed(..)
  , SKeyedExt(..)
  , withSKeyedExt
  , toSKeyedExt
  -- * Static tables and resolving values
  , gwithStatic
  , withStaticCts
  , withSomeStaticCts
  , withStaticCxt
  , withSomeStaticCxt
  -- * Static closures
  , PreClosure(..)
  , Closure(..)
  , PostClosure(..)
  , ClosureApply
  , applyClosure
  , envTabCons
  , envTabNil
  , mkClosureTab
  , RepClosure
  , RepClosure'
  , repClosureTab
  , withEvalClosureCts
  , withEvalSomeClosureCts
  , withEvalClosureCxt
  , withEvalSomeClosureCxt
  , evalClosure
  , evalSomeClosure
  -- * Serialisation
  , RepVal(..)
  , SKeyedError(..)
  , DoubleEncoding(..)
  , DSerialise
  , DBinary
  )
where

import           Control.Static.Closure
import           Control.Static.Common
import           Control.Static.Serialise
import           Control.Static.Static

-- Note, the implementation comments in these files make various references to
-- "singletons defunctionalisation symbols", see here for an approachable
-- explanation:
--
-- https://blog.jle.im/entry/introduction-to-singletons-4.html#defunctionalization
--
-- You may want to start from part 1, if you have trouble jumping in the middle.