module Exon (
  -- $intro
  module Exon.Quote,
  -- * Customizing Concatenation
  module Exon.Class.Exon,
  -- * Combinators
  module Exon.Combinators,
  -- * Data Types
  module Exon.Data.Segment,
  module Exon.Data.Result,
) where

import Exon.Class.Exon (Exon (..), ExonDefault)
import Exon.Data.Result (Result (..))
import Exon.Data.Segment (Segment (..))
import Exon.Quote (exon)
import Exon.Combinators (intercalate)

-- $intro
-- This Haskell library provides quasiquote string interpolation with customizable concatenation for arbitrary types.
--
-- The default case uses `Monoid` and `IsString`:
--
-- @
-- import Exon (exon)
-- import Data.Text (toUpper)
--
-- newtype Name =
--   Name Text
--   deriving newtype (Show, Monoid, IsString)
--
-- instance Semigroup Name where
--   Name l <> Name r = Name (l <> " | " <> r)
--
-- lastName :: Name
-- lastName = "Fry"
--
-- up :: Name -> Name
-- up (Name name) = Name (toUpper name)
--
-- >>> [exon|Philip J. #{up lastName}|]
-- Name "Philip | J. | FRY"
--
-- @
--
-- Individual segments are tokenized at whitespace boundaries, expressions between `#{` and `}` are inserted verbatim.
--
-- The default implementation ignores whitespace when concatenating, while it is preserved for `String`, `Text` etc.