packages feed

multifocal-0.0.1: src/Language/TLT/Tlt2Strat.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Language.TLT.Tlt2Strat
-- Copyright   :  (c) 2011 University of Minho
-- License     :  BSD3
--
-- Maintainer  :  hpacheco@di.uminho.pt
-- Stability   :  experimental
-- Portability :  non-portable
--
-- Multifocal:
-- Bidirectional Two-level Transformation of XML Schemas
-- 
-- Conversion from the two-level language into strategic combinators
--
-----------------------------------------------------------------------------

module Language.TLT.Tlt2Strat where

import Data.Type
import Data.Equal
import Data.Spine

import Data.Transform.TwoLevel
import Language.TLT.TltSyntax
import Language.XML.Xsd2Type
import Language.XPath.XPath2Pf

import Control.Monad.State as ST hiding (when)
import Data.Map as Map
import Data.List as List

tlt2strat :: MonadPlus m => TLT -> StateT TopMap m RuleTRep
tlt2strat Nop = return $ RuleTRep nop
tlt2strat (Comp r1 r2) = do
	RuleTRep x <- tlt2strat r1
	RuleTRep y <- tlt2strat r2
	return $ RuleTRep (x >>> y)
tlt2strat (Choice r1 r2) = do
	RuleTRep x <- tlt2strat r1
	RuleTRep y <- tlt2strat r2
	return $ RuleTRep (x ||| y)
tlt2strat (Try r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (try x)
tlt2strat (Many r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (many x)	
tlt2strat (All r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (allNorm x)
tlt2strat (Once r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (onceNorm x)
tlt2strat (Everywhere r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (everywhere x)
tlt2strat (Outermost r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (outermost x)
tlt2strat (At name r) = do
	RuleTRep x <- tlt2strat r
	return $ RuleTRep (at name x)
tlt2strat (When name r) = do
	RuleTRep x <- tlt2strat r
	types <- ST.get
	case Map.lookup name types of
		Just (DynT t) -> return $ RuleTRep $ when (normalizedteq t) x
		otherwise     -> error $ "element tag " ++ name ++ " undefined in input XML Schema"
tlt2strat (Hoist) = return $ RuleTRep hoist
tlt2strat (Plunge name) = return $ RuleTRep $ plunge name
tlt2strat (Rename name) = return $ RuleTRep $ rename name
tlt2strat Erase = return $ RuleTRep erase
tlt2strat (Select xpath) = do
	pf <- xpath2pf xpath
	return $ RuleTRep (liftQ pf)