content: {- |
  Module                  : Toml.Codec
  Copyright               : (c) 2018-2022 Kowainik
  SPDX-License-Identifier : MPL-2.0
  Maintainer              : Kowainik <xrom.xkov@gmail.com>
  Stability               : Stable
  Portability             : Portable
  
  This module provides utilities for implementing and using
  bidirectional TOML codecs. The concept of bidirectional conversion in
  @tomland@ has two parts: __'TomlBiMap'__ and __'TomlCodec'__.
  
  == General TOML description
  
  In the following TOML
  
  @
  name = "foo"
  @
  
  we call @name@ as __key__ and @"foo"@ as __value__.
  
  == 'TomlBiMap'
  
  'TomlBiMap' provides a bidirectional conversion between
  __TOML values__ and Haskell primitive values. TOML specification
  defines some primitive values you can use in key-value pairs
  (e.g. /integer/, /string/, /local time/). 'TomlBiMap' provides a way
  to convert between TOML primitives and Haskell values. 'TomlBiMap'
  doesn't know anything about TOML keys.
  
  == 'TomlCodec'
  
  'TomlCodec' describes how to convert in both ways between a single or
  multiple key-value pairs and Haskell types. @tomland@ provides basic
  primitives for decoding and encoding single key-value pairs, but also
  a way to compose multiple 'TomlCodec's into a single one. So, if you
  have a custom data type, that has several fields or several
  constructors, you need to define 'TomlCodec' for your data type.
  
  == Encoding and decoding
  
  If you have a type like @User@ then @userCodec :: 'TomlCodec' User@ is
  an object that describes how to 'encode' a value of type @User@ to
  TOML and 'decode' TOML to a value of type @User@.
  
  * To TOML: @'encode' userCodec someUser@
  * From TOML: @'decode' userCodec someToml@
  
  == Naming conventions
  
  @tomland@ uses the following naming conventions (and encourages
  library users to follow them as well):
  
  * __\_SomeName__: for 'TomlBiMap' (e.g. '_Int', '_Text', '_Array')
  * __someName__: for basic 'TomlCodec's (e.g. 'int', 'text', 'arrayOf')
  * __someNameCodec__: for user defined codecs for custom types (e.g. @userCodec@, @configCodec@, @serverCodec@)
  
  @since 1.3.0.0
  -}
  
  module Toml.Codec
      ( -- $types
        module Toml.Codec.Types
        -- $error
      , module Toml.Codec.Error
        -- $code
      , module Toml.Codec.Code
        -- $di
      , module Toml.Codec.Di
        -- $combinator
      , module Toml.Codec.Combinator
        -- $generic
      , module Toml.Codec.Generic
        -- $bimap
      , module Toml.Codec.BiMap
        -- $bimapConversion
      , module Toml.Codec.BiMap.Conversion
      ) where
  
  import Toml.Codec.BiMap
  import Toml.Codec.BiMap.Conversion
  import Toml.Codec.Code
  import Toml.Codec.Combinator
  import Toml.Codec.Di
  import Toml.Codec.Error
  import Toml.Codec.Generic
  import Toml.Codec.Types
  
  {- $types
  Core codec types, including @Toml@ specialised ones: 'TomlCodec', 'TomlState'
  and 'TomlEnv'.
  -}
  
  {- $error
  Core error types, including 'TomlDecodeError' and 'LoadTomlException'.
  -}
  
  {- $code
  Contains TOML-specific combinators for converting between TOML and user data
  types.
  -}
  
  {- $di
  Forward and backward mapping functions and combinators (similar to profunctors).
  -}
  
  {- $combinator
  Contains TOML-specific combinators and codecs for converting between TOML and
  user data types.
  -}
  
  {- $generic
  Automatic TOML codecs using 'GHC.Generics.Generic'.
  -}
  
  {- $bimap
  'BiMap' type that represents /Tagged Partial Bidirectional Conversion/
  between TOML primitives and Haskell types.
  -}
  
  {- $bimapConversion
  Specific implementations of 'BiMap' between Haskell types and TOML
  values.
  -}
  