module InESRL where

import AbsESRL
import Control.Monad.State

-- |SRL文のStepを反転する関数
transStepIn :: Step -> Step
transStepIn (SasnAdd i e) = SasnMin i e --invert
transStepIn (SasnMin i e) = SasnAdd i e --invert
transStepIn (SasnXor i e) = SasnXor i e
transStepIn (SasnArrAdd i e1 e2) = SasnArrMin i e1 e2 --invert
transStepIn (SasnArrMin i e1 e2) = SasnArrAdd i e1 e2 --invert
transStepIn (SasnArrXor i e1 e2) = SasnArrXor i e1 e2
transStepIn (Spush i1 i2) = Spop i1 i2--invert
transStepIn (Spop i1 i2) = Spush i1 i2--invert
transStepIn (Sskip) = Sskip
transStepIn (Sasnasn i1 i2) = Sasnasn i1 i2         --add
transStepIn (SArrasn i1 e i2) = SArrasn i1 e i2     --add
transStepIn (SasnArr i1 i2 e) = SasnArr i1 i2 e     --add
transStepIn (SArrArr i1 e1 i2 e2) = SArrArr i1 e1 i2 e2   --add

-- |反転したSRL文を表示する関数
inSRL :: SRL -> SRL
inSRL (ESRL b) = ESRL (map srlInv b)

-- |受けとったリストの要素がif文、from文、step文のどれなのかを判別し、文の種類に応じて適切に反転する関数
srlInv :: Blk -> Blk
srlInv x = case x of
  Bstep c           ->  Bstep (transStepIn c)                --step文
  Bif ea ba bb eb   ->  Bif eb (map srlInv ba) (map srlInv bb) ea    --if文
  Bfrom ea ba bb eb ->  Bfrom eb (map srlInv ba) (map srlInv bb) ea  --from文
  Brif ea b eb      ->  Brif eb (map srlInv b) ea                --add rif文
