LslPlus-0.1.1: Language/Lsl/Internal/DOMSourceDescriptor.hs
{-# OPTIONS_GHC -XFlexibleContexts #-}
module Language.Lsl.Internal.DOMSourceDescriptor(sourceFiles,sourceFilesElement) where
import Control.Monad.Error(MonadError(..))
import Language.Lsl.Internal.DOMProcessing(ElemAcceptor(..),elementList,findElement,match,simple)
import Text.XML.HaXml(Element(..),Content(..))
sourceFiles e = match sourceFilesElement e
sourceFilesElement :: MonadError String m => ElemAcceptor m ([(String,String)],[(String,String)])
sourceFilesElement =
let f (Elem _ _ contents) = do
(m,contents1) <- findElement modulesElement [ e | e@(CElem _ _) <- contents ]
(s,[]) <- findElement scriptsElement contents1
return (m,s)
in ElemAcceptor "source_files" f
modulesElement :: MonadError String m => ElemAcceptor m [(String,String)]
modulesElement = elementList "modules" itemElement
scriptsElement :: MonadError String m => ElemAcceptor m [(String,String)]
scriptsElement = elementList "scripts" itemElement
itemElement :: MonadError String m => ElemAcceptor m (String,String)
itemElement =
let f (Elem _ _ contents) = do
(id,contents1) <- findElement idElement [ e | e@(CElem _ _) <- contents ]
(p,[]) <- findElement pathElement contents1
return (id,p)
in ElemAcceptor "item" f
idElement :: MonadError String m => ElemAcceptor m String
idElement = ElemAcceptor "identifier" simple
pathElement :: MonadError String m => ElemAcceptor m String
pathElement = ElemAcceptor "path" simple