module Text.TOML.Value
  ( TOML (..)
  , TOMLV (..)
  , Value
  , tempty
  , tinsert
  , liftT
  , liftTV
  )where

import Data.Map ( Map )
import qualified Data.Map as M
import Data.Time.Clock
import Data.Time.Format

import System.Locale


type Value = Either TOML TOMLV

newtype TOML = TOML (Map String Value)
    deriving ( Eq, Ord, Show )

data TOMLV
    = VString String
    | VInteger Integer
    | VDouble Double
    | VBool Bool
    | VArray [TOMLV]
    | VDocument TOML
    | VDate UTCTime
    deriving ( Eq, Ord, Show )

tempty = TOML M.empty

liftT :: (Map String Value -> Map String Value) -> TOML -> TOML
liftT f (TOML m) = (TOML $ f m)

liftTV :: (TOML -> TOML) -> Value -> Value
liftTV f (Left  t) = Left $ f t
liftTV f (Right _) = Left $ f tempty

tinsert :: String -> Value -> TOML -> TOML
tinsert k v t = liftT (M.insert k v) t