module Data.EDN
  ( TaggedValue
  , Tagged(..)
  , stripTag
  , Value(..)
  , EDNList, EDNVec, EDNMap, EDNSet
  , mkList, mkVec, mkMap, mkSet
  , parseText
  , renderText

  , encodeText
  , ToEDN(..)
  , toEDNtagged

  , decodeText
  , FromEDN(..)
  , fromEDN
  , withTagged
  , withNoTag
  , withNil
  , withBoolean
  , withString
  , withCharacter
  , withSymbol
  , withKeyword
  , withTextual
  , withInteger
  , withIntegral
  , withFloating
  , withFractional
  , withList
  , withVec
  , withMap
  , withSet
  , unexpected
  , vecGet
  , mapGetKeyword
  , mapGetString
  , mapGetSymbol
  , mapGetSymbolNS

) where

import Data.Text (Text)

import Data.EDN.AST.Parser (parseText)
import Data.EDN.AST.Printer (renderText)
import Data.EDN.AST.Types.Tagged
import Data.EDN.AST.Types.Value
import Data.EDN.Class

encodeText :: ToEDN a => a -> Text
encodeText =
  renderText . toEDN

decodeText :: (FromEDN a, Monad m) => String -> Text -> m a
decodeText sourceName source =
  parseText sourceName source >>= fromEDN