module Hydrogen.Data (
    emptyNode
  , loadData
  , merge
  , Data
  ) where

import Hydrogen.Prelude

import Hydrogen.Syntax.Parser
import Hydrogen.Data.Parser
import Hydrogen.Data.Types

import Hydrogen.Util.Parsec hiding (parse)

import qualified Data.Map as Map

merge :: Data -> Data -> Data
merge d1 d2 = case (d1, d2) of
    (DNode m1 l1, DNode m2 l2) -> DNode (Map.unionWith merge m1 m2) (l1 ++ l2)
    (_, dx) -> dx

emptyNode :: Data
emptyNode = DNode Map.empty []

loadData :: FilePath -> IO (Either SomethingBad Data)
loadData fp = (parseData <+< parse fp) <$> readFile fp