---- Copyright (c) 2009-2011, ERICSSON AB-- All rights reserved.---- Redistribution and use in source and binary forms, with or without-- modification, are permitted provided that the following conditions are met:---- * Redistributions of source code must retain the above copyright notice,-- this list of conditions and the following disclaimer.-- * Redistributions in binary form must reproduce the above copyright-- notice, this list of conditions and the following disclaimer in the-- documentation and/or other materials provided with the distribution.-- * Neither the name of the ERICSSON AB nor the names of its contributors-- may be used to endorse or promote products derived from this software-- without specific prior written permission.---- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE-- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR-- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER-- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.--{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE UndecidableInstances #-}{-# LANGUAGE MultiParamTypeClasses #-}moduleFeldspar.Compiler.Backend.C.Plugin.Rule(RulePlugin(..))whereimportData.TypeableimportFeldspar.TransformationimportFeldspar.Compiler.Backend.C.OptionsdataRulePlugin=RulePlugininstanceTransformationRulePluginwheretypeFromRulePlugin=()typeToRulePlugin=()typeDownRulePlugin=OptionstypeUpRulePlugin=[Rule]typeStateRulePlugin=IntinstancePluginRulePluginwheretypeExternalInfoRulePlugin=OptionsexecutePlugin_externalInfo=result.transformRulePlugin0externalInfoinstance(DefaultTransformableRulePlugint,Typeable1t)=>TransformableRulePlugintwheretransformtsdorig=recurse{result=x'',up=pr1++pr2++pr3,state=newID2}whererecurse=defaultTransformtsdorigapplyRule::t()->Int->[Rule]->(t(),[Rule],[Rule],Int)applyRulecx=foldlapplyRuleFun(c,[],[],x)whereapplyRuleFun::(t(),[Rule],[Rule],Int)->Rule->(t(),[Rule],[Rule],Int)applyRuleFun(cc,incomp,prop,currentID)(Ruler)=casecastrofNothing->(cc,incomp++[Ruler],prop,currentID)Justr'->(cc',incomp,prop++prop',newID)where(cc',prop',newID)=applyActioncccurrentID(r'cc)applyAction::t()->Int->[Action(t())]->(t(),[Rule],Int)applyActionccccid=foldlapplyActionFun(ccc,[],cid)whereapplyActionFun::(t(),[Rule],Int)->Action(t())->(t(),[Rule],Int)applyActionFun(_,prop'',i)(ReplacenewConstr)=(newConstr,prop'',i)applyActionFun(ccc',prop'',i)(Propagatepr)=(ccc',prop''++[pr],i)applyActionFun(constr,_,i)(WithIdf)=applyActionconstr(i+1)(fi)applyActionFun(constr,_,i)(WithOptionsf)=applyActionconstri(fd)(x',_,pr1,newID1)=applyRule(resultrecurse)(staterecurse)(rulesd)(x'',pr3,pr2,newID2)=applyRulex'newID1(uprecurse)instanceCombine[Rule]wherecombine=(++)