packages feed

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