content: {-# LANGUAGE ConstraintKinds #-}
  {-# LANGUAGE KindSignatures #-}
  {-# LANGUAGE TypeInType #-}
  
  -- | Defines a capability type class for a state effect. A state capability
  -- provides a state which can be retrieved with 'get' and set with 'put'. As an
  -- analogy, each state capability is equivalent to making one @IORef@ available
  -- in an @IO@ computation (except, of course, that a state capability does not
  -- have to be provided by @IO@).
  --
  -- This is a very expressive capability. It is often preferable to restrict to
  -- less powerful capabilities such as "Capability.Reader", "Capability.Writer",
  -- or "Capability.Stream".
  
  module Capability.State
    ( -- * Relational capability
      module Capability.State.Internal.Class
      -- * Functional capability
    , HasState'
    , TypeOf
      -- * Strategies
    , module Capability.State.Internal.Strategies
      -- ** Modifiers
    , module Capability.Accessors
    ) where
  
  import Capability.Accessors
  import Capability.State.Internal.Class
  import Capability.State.Internal.Strategies
  import Capability.TypeOf
  
  -- | Type synonym using the 'TypeOf' type family to specify 'HasState'
  -- constraints without having to specify the type associated to a tag.
  type HasState' (tag :: k) = HasState tag (TypeOf k tag)
  