{-# LANGUAGE DeriveDataTypeable #-}
module Data.EDN.AST.Types.Value
( TaggedValue
, Value(..)
, EDNList
, EDNVec
, EDNMap
, EDNSet
, mkList
, mkVec
, mkMap
, mkSet
) where
import Data.Data (Data)
import Data.Foldable (toList)
import Data.Text (Text)
import qualified Data.Map.Strict as M
import qualified Data.Set as S
import qualified Data.Vector as V
import Data.EDN.AST.Types.Tagged (Tagged)
type TaggedValue = Tagged Text Value
data Value
= Nil
| Boolean !Bool
| String !Text
| Character !Char
| Symbol !Text !Text
| Keyword !Text
| Integer !Int
| Floating !Double
| List !EDNList
| Vec !EDNVec
| Map !EDNMap
| Set !EDNSet
deriving (Eq, Ord, Show, Data)
type EDNList = [TaggedValue]
type EDNVec = V.Vector TaggedValue
type EDNMap = M.Map TaggedValue TaggedValue
type EDNSet = S.Set TaggedValue
mkList :: Foldable f => f TaggedValue -> Value
mkList = List . toList
mkVec :: Foldable f => f TaggedValue -> Value
mkVec = Vec . V.fromList . toList
mkMap :: Foldable f => f (TaggedValue, TaggedValue) -> Value
mkMap = Map . M.fromList . toList
mkSet :: Foldable f => f TaggedValue -> Value
mkSet = Set . S.fromList . toList