{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE CPP #-}
import Control.Monad
import qualified Language.Lua as LUA -- from language-lua
import Generics.MultiRec hiding (show)
import Generics.MultiRec.Transformations.Main
-- From https://github.com/leafo/lapis/commits/629c559094df41694bea0a33a2be75115c544dad/lapis/application.lua
files :: [FilePath]
files = ["examples/LUA_project/" ++ f
| f <- [ "application.lua." ++ show n | n <- [1..90] ] ]
--------------------------------------------------------------------------------
-- Main
--------------------------------------------------------------------------------
main :: IO ()
main = do
putStrLn "Parsing"
psr <- forM files $ LUA.parseFile
let ps = [ (p,f) | (Right p,f) <- zip psr files ]
putStrLn "Diffing"
forM_ (zip ps (tail ps)) $ \((p1,f1),(p2,f2)) -> do
putStrLn $ f1 ++ " --> " ++ f2
let df = diff Block p1 p2
print $ length df
print $ apply Block p1 df == Just p2
--------------------------------------------------------------------------------
-- Multirec instance
--------------------------------------------------------------------------------
data AST :: * -> * where
Stat :: AST LUA.Stat
Exp :: AST LUA.Exp
Var :: AST LUA.Var
Binop :: AST LUA.Binop
Unop :: AST LUA.Unop
PrefixExp :: AST LUA.PrefixExp
TableField :: AST LUA.TableField
Block :: AST LUA.Block
FunName :: AST LUA.FunName
FunBody :: AST LUA.FunBody
FunCall :: AST LUA.FunCall
FunArg :: AST LUA.FunArg
deriving instance Ord LUA.Stat
deriving instance Ord LUA.Exp
deriving instance Ord LUA.Var
deriving instance Ord LUA.Binop
deriving instance Ord LUA.Unop
deriving instance Ord LUA.PrefixExp
deriving instance Ord LUA.TableField
deriving instance Ord LUA.Block
deriving instance Ord LUA.FunName
deriving instance Ord LUA.FunBody
deriving instance Ord LUA.FunCall
deriving instance Ord LUA.FunArg
#if OLD_APPROACH
instance Transform AST
instance OrdI AST where
indexI Stat = 0
indexI Exp = 1
indexI Var = 2
indexI Binop = 3
indexI Unop = 4
indexI PrefixExp = 5
indexI TableField = 6
indexI Block = 7
indexI FunName = 8
indexI FunBody = 9
indexI FunCall = 10
indexI FunArg = 11
#else
type instance Ixs AST = '[ LUA.Stat, LUA.Exp, LUA.Var, LUA.Binop, LUA.Unop, LUA.PrefixExp, LUA.TableField, LUA.Block, LUA.FunName, LUA.FunBody, LUA.FunCall, LUA.FunArg ]
#endif
-- Automatically generated and manually edited
data Assign
data FunCall
data Label
data Break
data Goto
data Do
data While
data Repeat
data If
data ForRange
data ForIn
data FunAssign
data LocalFunAssign
data LocalAssign
data EmptyStat
instance Constructor Assign where
conName _ = "Assign"
instance Constructor FunCall where
conName _ = "FunCall"
instance Constructor Label where
conName _ = "Label"
instance Constructor Break where
conName _ = "Break"
instance Constructor Goto where
conName _ = "Goto"
instance Constructor Do where
conName _ = "Do"
instance Constructor While where
conName _ = "While"
instance Constructor Repeat where
conName _ = "Repeat"
instance Constructor If where
conName _ = "If"
instance Constructor ForRange where
conName _ = "ForRange"
instance Constructor ForIn where
conName _ = "ForIn"
instance Constructor FunAssign where
conName _ = "FunAssign"
instance Constructor LocalFunAssign where
conName _ = "LocalFunAssign"
instance Constructor LocalAssign where
conName _ = "LocalAssign"
instance Constructor EmptyStat where
conName _ = "EmptyStat"
data Nil
data LBool
data Number
data LString
data Vararg
data EFunDef
data PrefixExp
data TableConst
data Binop
data Unop
instance Constructor Nil where
conName _ = "Nil"
instance Constructor LBool where
conName _ = "Bool"
instance Constructor Number where
conName _ = "Number"
instance Constructor LString where
conName _ = "String"
instance Constructor Vararg where
conName _ = "Vararg"
instance Constructor EFunDef where
conName _ = "EFunDef"
instance Constructor PrefixExp where
conName _ = "PrefixExp"
instance Constructor TableConst where
conName _ = "TableConst"
instance Constructor Binop where
conName _ = "Binop"
instance Constructor Unop where
conName _ = "Unop"
data VarName
data Select
data SelectName
instance Constructor VarName where
conName _ = "VarName"
instance Constructor Select where
conName _ = "Select"
instance Constructor SelectName where
conName _ = "SelectName"
data Add
data Sub
data Mul
data Div
data Exp
data Mod
data Concat
data LT
data LTE
data GT
data GTE
data EQ
data NEQ
data And
data Or
instance Constructor Add where
conName _ = "Add"
instance Constructor Sub where
conName _ = "Sub"
instance Constructor Mul where
conName _ = "Mul"
instance Constructor Div where
conName _ = "Div"
instance Constructor Exp where
conName _ = "Exp"
instance Constructor Mod where
conName _ = "Mod"
instance Constructor Concat where
conName _ = "Concat"
instance Constructor LT where
conName _ = "LT"
instance Constructor LTE where
conName _ = "LTE"
instance Constructor GT where
conName _ = "GT"
instance Constructor GTE where
conName _ = "GTE"
instance Constructor EQ where
conName _ = "EQ"
instance Constructor NEQ where
conName _ = "NEQ"
instance Constructor And where
conName _ = "And"
instance Constructor Or where
conName _ = "Or"
data Neg
data Not
data Len
instance Constructor Neg where
conName _ = "Neg"
instance Constructor Not where
conName _ = "Not"
instance Constructor Len where
conName _ = "Len"
data PEVar
data PEFunCall
data Paren
instance Constructor PEVar where
conName _ = "PEVar"
instance Constructor PEFunCall where
conName _ = "PEFunCall"
instance Constructor Paren where
conName _ = "Paren"
data ExpField
data NamedField
data Field
instance Constructor ExpField where
conName _ = "ExpField"
instance Constructor NamedField where
conName _ = "NamedField"
instance Constructor Field where
conName _ = "Field"
data Block
instance Constructor Block where
conName _ = "Block"
data FunName
instance Constructor FunName where
conName _ = "FunName"
data FunBody
instance Constructor FunBody where
conName _ = "FunBody"
data NormalFunCall
data MethodCall
instance Constructor NormalFunCall where
conName _ = "NormalFunCall"
instance Constructor MethodCall where
conName _ = "MethodCall"
data Args
data TableArg
data StringArg
instance Constructor Args where
conName _ = "Args"
instance Constructor TableArg where
conName _ = "TableArg"
instance Constructor StringArg where
conName _ = "StringArg"
type instance PF AST = (:+:) ((:>:)
((:+:) (C Assign ((:*:) ((:.:) [] (I LUA.Var)) ((:.:) [] (I LUA.Exp))))
((:+:) (C FunCall (I LUA.FunCall))
((:+:) (C Label (K LUA.Name))
((:+:) (C Break U)
((:+:) (C Goto (K LUA.Name))
((:+:) (C Do (I LUA.Block))
((:+:) (C While ((:*:) (I LUA.Exp) (I LUA.Block)))
((:+:) (C Repeat ((:*:) (I LUA.Block) (I LUA.Exp)))
((:+:) (C If ((:*:) ((:.:) [] ((:*:) (I LUA.Exp) (I LUA.Block))) ((:.:) Maybe (I LUA.Block)))) -- Manually changed, is it correct?
((:+:) (C ForRange ((:*:) (K LUA.Name) ((:*:) (I LUA.Exp) ((:*:) (I LUA.Exp) ((:*:) ((:.:) Maybe (I LUA.Exp)) (I LUA.Block))))))
((:+:) (C ForIn ((:*:) ((:.:) [] (K LUA.Name)) ((:*:) ((:.:) [] (I LUA.Exp)) (I LUA.Block))))
((:+:) (C FunAssign ((:*:) (I LUA.FunName) (I LUA.FunBody)))
((:+:) (C LocalFunAssign ((:*:) (K LUA.Name) (I LUA.FunBody)))
((:+:) (C LocalAssign ((:*:) ((:.:) [] (K LUA.Name)) ((:.:) Maybe ((:.:) [] (I LUA.Exp)))))
(C EmptyStat U))))))))))))))) LUA.Stat) ((:+:) ((:>:)
((:+:) (C Nil U)
((:+:) (C LBool (K Bool))
((:+:) (C Number (K String))
((:+:) (C LString (K String))
((:+:) (C Vararg U)
((:+:) (C EFunDef (I LUA.FunBody))
((:+:) (C PrefixExp (I LUA.PrefixExp))
((:+:) (C TableConst ((:.:) [] (I LUA.TableField)))
((:+:) (C Binop ((:*:) (I LUA.Binop) ((:*:) (I LUA.Exp) (I LUA.Exp))))
(C Unop ((:*:) (I LUA.Unop) (I LUA.Exp)))))))))))) LUA.Exp) ((:+:) ((:>:)
((:+:) (C VarName (K LUA.Name))
((:+:) (C Select ((:*:) (I LUA.PrefixExp) (I LUA.Exp))) (C SelectName ((:*:) (I LUA.PrefixExp) (K LUA.Name))))) LUA.Var) ((:+:) ((:>:)
((:+:) (C Add U)
((:+:) (C Sub U)
((:+:) (C Mul U)
((:+:) (C Div U)
((:+:) (C Exp U)
((:+:) (C Mod U)
((:+:) (C Concat U)
((:+:) (C LT U)
((:+:) (C LTE U)
((:+:) (C GT U)
((:+:) (C GTE U)
((:+:) (C EQ U)
((:+:) (C NEQ U)
((:+:) (C And U) (C Or U))))))))))))))) LUA.Binop)
((:+:) ((:>:)
((:+:) (C Neg U)
((:+:) (C Not U) (C Len U))) LUA.Unop)
((:+:) ((:>:)
((:+:) (C PEVar (I LUA.Var))
((:+:) (C PEFunCall (I LUA.FunCall)) (C Paren (I LUA.Exp)))) LUA.PrefixExp)
((:+:) ((:>:)
((:+:) (C ExpField ((:*:) (I LUA.Exp) (I LUA.Exp)))
((:+:) (C NamedField ((:*:) (K LUA.Name) (I LUA.Exp))) (C Field (I LUA.Exp)))) LUA.TableField)
((:+:) ((:>:) (C Block ((:*:) ((:.:) [] (I LUA.Stat)) ((:.:) Maybe ((:.:) [] (I LUA.Exp))))) LUA.Block)
((:+:) ((:>:) (C FunName ((:*:) (K LUA.Name) ((:*:) ((:.:) [] (K LUA.Name)) ((:.:) Maybe (K LUA.Name))))) LUA.FunName)
((:+:) ((:>:) (C FunBody ((:*:) ((:.:) [] (K LUA.Name)) ((:*:) (K Bool) (I LUA.Block)))) LUA.FunBody)
((:+:) ((:>:)
((:+:) (C NormalFunCall ((:*:) (I LUA.PrefixExp) (I LUA.FunArg))) (C MethodCall ((:*:) (I LUA.PrefixExp) ((:*:) (K LUA.Name) (I LUA.FunArg))))) LUA.FunCall) ((:>:)
((:+:) (C Args ((:.:) [] (I LUA.Exp)))
((:+:) (C TableArg ((:.:) [] (I LUA.TableField))) (C StringArg (K String)))) LUA.FunArg)))))))))))
instance El AST LUA.Stat where
proof = Stat
instance El AST LUA.Exp where
proof = Exp
instance El AST LUA.Var where
proof = Var
instance El AST LUA.Binop where
proof = Binop
instance El AST LUA.Unop where
proof = Unop
instance El AST LUA.PrefixExp where
proof = PrefixExp
instance El AST LUA.TableField where
proof = TableField
instance El AST LUA.Block where
proof = Block
instance El AST LUA.FunName where
proof = FunName
instance El AST LUA.FunBody where
proof = FunBody
instance El AST LUA.FunCall where
proof = FunCall
instance El AST LUA.FunArg where
proof = FunArg
instance Fam AST where
from Stat (LUA.Assign f0 f1)
= L (Tag
(L (C ((:*:)
((D . (fmap (I . I0))) f0) ((D . (fmap (I . I0))) f1)))))
from Stat (LUA.FunCall f0)
= L (Tag (R (L (C ((I . I0) f0)))))
from Stat (LUA.Label f0) = L (Tag (R (R (L (C (K f0))))))
from Stat LUA.Break = L (Tag (R (R (R (L (C U))))))
from Stat (LUA.Goto f0) = L (Tag (R (R (R (R (L (C (K f0))))))))
from Stat (LUA.Do f0)
= L (Tag (R (R (R (R (R (L (C ((I . I0) f0)))))))))
from Stat (LUA.While f0 f1)
= L (Tag
(R (R (R (R (R (R (L (C ((:*:)
((I . I0) f0) ((I . I0) f1)))))))))))
from Stat (LUA.Repeat f0 f1)
= L (Tag
(R (R (R (R (R (R (R (L (C ((:*:)
((I . I0) f0) ((I . I0) f1))))))))))))
from Stat (LUA.If f0 f1)
= L (Tag
(R (R (R (R (R (R (R (R (L (C ((:*:)
(D [((I . I0) e :*: (I . I0) b) | (e, b) <- f0])
((D . (fmap (I . I0))) f1)))))))))))))
from Stat (LUA.ForRange f0 f1 f2 f3 f4)
= L (Tag
(R (R (R (R (R (R (R (R (R (L (C ((:*:)
(K f0)
((:*:)
((I . I0) f1)
((:*:)
((I . I0) f2)
((:*:)
((D . (fmap (I . I0))) f3)
((I . I0) f4)))))))))))))))))
from Stat (LUA.ForIn f0 f1 f2)
= L (Tag
(R (R (R (R (R (R (R (R (R (R (L (C ((:*:)
((D . (fmap K)) f0)
((:*:)
((D . (fmap (I . I0))) f1)
((I . I0) f2))))))))))))))))
from Stat (LUA.FunAssign f0 f1)
= L (Tag
(R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:)
((I . I0) f0) ((I . I0) f1))))))))))))))))
from Stat (LUA.LocalFunAssign f0 f1)
= L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:)
(K f0) ((I . I0) f1)))))))))))))))))
from Stat (LUA.LocalAssign f0 f1)
= L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:)
((D . (fmap K)) f0)
((D . (fmap (D . (fmap (I . I0)))))
f1))))))))))))))))))
from Stat LUA.EmptyStat
= L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (R (R (C U))))))))))))))))
from Exp LUA.Nil = R (L (Tag (L (C U))))
from Exp (LUA.Bool f0) = R (L (Tag (R (L (C (K f0))))))
from Exp (LUA.Number f0) = R (L (Tag (R (R (L (C (K f0)))))))
from Exp (LUA.String f0) = R (L (Tag (R (R (R (L (C (K f0))))))))
from Exp LUA.Vararg = R (L (Tag (R (R (R (R (L (C U))))))))
from Exp (LUA.EFunDef f0)
= R (L (Tag (R (R (R (R (R (L (C ((I . I0) f0))))))))))
from Exp (LUA.PrefixExp f0)
= R (L (Tag (R (R (R (R (R (R (L (C ((I . I0) f0)))))))))))
from Exp (LUA.TableConst f0)
= R (L (Tag
(R (R (R (R (R (R (R (L (C ((D . (fmap (I . I0))) f0))))))))))))
from Exp (LUA.Binop f0 f1 f2)
= R (L (Tag
(R (R (R (R (R (R (R (R (L (C ((:*:)
((I . I0) f0)
((:*:) ((I . I0) f1) ((I . I0) f2)))))))))))))))
from Exp (LUA.Unop f0 f1)
= R (L (Tag
(R (R (R (R (R (R (R (R (R (C ((:*:)
((I . I0) f0) ((I . I0) f1))))))))))))))
from Var (LUA.VarName f0) = R (R (L (Tag (L (C (K f0))))))
from Var (LUA.Select f0 f1)
= R (R (L (Tag (R (L (C ((:*:) ((I . I0) f0) ((I . I0) f1))))))))
from Var (LUA.SelectName f0 f1)
= R (R (L (Tag (R (R (C ((:*:) ((I . I0) f0) (K f1))))))))
from Binop LUA.Add = R (R (R (L (Tag (L (C U))))))
from Binop LUA.Sub = R (R (R (L (Tag (R (L (C U)))))))
from Binop LUA.Mul = R (R (R (L (Tag (R (R (L (C U))))))))
from Binop LUA.Div = R (R (R (L (Tag (R (R (R (L (C U)))))))))
from Binop LUA.Exp
= R (R (R (L (Tag (R (R (R (R (L (C U))))))))))
from Binop LUA.Mod = R (R (R (L (Tag (R (R (R (R (R (L (C U)))))))))))
from Binop LUA.Concat
= R (R (R (L (Tag (R (R (R (R (R (R (L (C U))))))))))))
from Binop LUA.LT
= R (R (R (L (Tag (R (R (R (R (R (R (R (L (C U)))))))))))))
from Binop LUA.LTE
= R (R (R (L (Tag (R (R (R (R (R (R (R (R (L (C U))))))))))))))
from Binop LUA.GT
= R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (L (C U)))))))))))))))
from Binop LUA.GTE
= R (R (R (L (Tag
(R (R (R (R (R (R (R (R (R (R (L (C U))))))))))))))))
from Binop LUA.EQ
= R (R (R (L (Tag
(R (R (R (R (R (R (R (R (R (R (R (L (C U)))))))))))))))))
from Binop LUA.NEQ
= R (R (R (L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (L (C U))))))))))))))))))
from Binop LUA.And
= R (R (R (L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (R (L (C U)))))))))))))))))))
from Binop LUA.Or
= R (R (R (L (Tag
(R (R (R (R (R (R (R (R (R (R (R (R (R (R (C U)))))))))))))))))))
from Unop LUA.Neg = R (R (R (R (L (Tag (L (C U)))))))
from Unop LUA.Not = R (R (R (R (L (Tag (R (L (C U))))))))
from Unop LUA.Len = R (R (R (R (L (Tag (R (R (C U))))))))
from PrefixExp (LUA.PEVar f0)
= R (R (R (R (R (L (Tag (L (C ((I . I0) f0)))))))))
from PrefixExp (LUA.PEFunCall f0)
= R (R (R (R (R (L (Tag (R (L (C ((I . I0) f0))))))))))
from PrefixExp (LUA.Paren f0)
= R (R (R (R (R (L (Tag (R (R (C ((I . I0) f0))))))))))
from TableField (LUA.ExpField f0 f1)
= R (R (R (R (R (R (L (Tag
(L (C ((:*:) ((I . I0) f0) ((I . I0) f1)))))))))))
from TableField (LUA.NamedField f0 f1)
= R (R (R (R (R (R (L (Tag
(R (L (C ((:*:) (K f0) ((I . I0) f1))))))))))))
from TableField (LUA.Field f0)
= R (R (R (R (R (R (L (Tag (R (R (C ((I . I0) f0)))))))))))
from Block (LUA.Block f0 f1)
= R (R (R (R (R (R (R (L (Tag
(C ((:*:)
((D . (fmap (I . I0))) f0)
((D . (fmap (D . (fmap (I . I0))))) f1)))))))))))
from FunName (LUA.FunName f0 f1 f2)
= R (R (R (R (R (R (R (R (L (Tag
(C ((:*:)
(K f0)
((:*:)
((D . (fmap K)) f1) ((D . (fmap K)) f2)))))))))))))
from FunBody (LUA.FunBody f0 f1 f2)
= R (R (R (R (R (R (R (R (R (L (Tag
(C ((:*:)
((D . (fmap K)) f0)
((:*:) (K f1) ((I . I0) f2))))))))))))))
from FunCall (LUA.NormalFunCall f0 f1)
= R (R (R (R (R (R (R (R (R (R (L (Tag
(L (C ((:*:) ((I . I0) f0) ((I . I0) f1)))))))))))))))
from FunCall (LUA.MethodCall f0 f1 f2)
= R (R (R (R (R (R (R (R (R (R (L (Tag
(R (C ((:*:)
((I . I0) f0)
((:*:) (K f1) ((I . I0) f2))))))))))))))))
from FunArg (LUA.Args f0)
= R (R (R (R (R (R (R (R (R (R (R (Tag
(L (C ((D . (fmap (I . I0))) f0))))))))))))))
from FunArg (LUA.TableArg f0)
= R (R (R (R (R (R (R (R (R (R (R (Tag
(R (L (C ((D . (fmap (I . I0))) f0)))))))))))))))
from FunArg (LUA.StringArg f0)
= R (R (R (R (R (R (R (R (R (R (R (Tag
(R (R (C (K f0)))))))))))))))
to Stat (L (Tag (L (C ((:*:) f0 f1)))))
= LUA.Assign
(((fmap (unI0 . unI)) . unD) f0) (((fmap (unI0 . unI)) . unD) f1)
to Stat (L (Tag (R (L (C f0)))))
= LUA.FunCall ((unI0 . unI) f0)
to Stat (L (Tag (R (R (L (C f0)))))) = LUA.Label (unK f0)
to Stat (L (Tag (R (R (R (L (C U))))))) = LUA.Break
to Stat (L (Tag (R (R (R (R (L (C f0)))))))) = LUA.Goto (unK f0)
to Stat (L (Tag (R (R (R (R (R (L (C f0)))))))))
= LUA.Do ((unI0 . unI) f0)
to Stat (L (Tag (R (R (R (R (R (R (L (C ((:*:) f0 f1)))))))))))
= LUA.While ((unI0 . unI) f0) ((unI0 . unI) f1)
to Stat (L (Tag (R (R (R (R (R (R (R (L (C ((:*:) f0 f1))))))))))))
= LUA.Repeat ((unI0 . unI) f0) ((unI0 . unI) f1)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (L (C ((:*:) f0 f1)))))))))))))
= LUA.If
[((unI0 . unI) e, (unI0 . unI) b) | (e :*: b) <- unD f0]
(((fmap (unI0 . unI)) . unD) f1)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (L (C ((:*:) f0
((:*:) f1
((:*:) f2
((:*:) f3 f4)))))))))))))))))
= LUA.ForRange
(unK f0)
((unI0 . unI) f1)
((unI0 . unI) f2)
(((fmap (unI0 . unI)) . unD) f3)
((unI0 . unI) f4)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (R (L (C ((:*:) f0
((:*:) f1 f2))))))))))))))))
= LUA.ForIn
(((fmap unK) . unD) f0)
(((fmap (unI0 . unI)) . unD) f1)
((unI0 . unI) f2)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:) f0
f1))))))))))))))))
= LUA.FunAssign ((unI0 . unI) f0) ((unI0 . unI) f1)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:) f0
f1)))))))))))))))))
= LUA.LocalFunAssign (unK f0) ((unI0 . unI) f1)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (R (L (C ((:*:) f0
f1))))))))))))))))))
= LUA.LocalAssign
(((fmap unK) . unD) f0)
(((fmap ((fmap (unI0 . unI)) . unD)) . unD) f1)
to
Stat
(L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (R (R (C U)))))))))))))))))
= LUA.EmptyStat
to Exp (R (L (Tag (L (C U))))) = LUA.Nil
to Exp (R (L (Tag (R (L (C f0)))))) = LUA.Bool (unK f0)
to Exp (R (L (Tag (R (R (L (C f0))))))) = LUA.Number (unK f0)
to Exp (R (L (Tag (R (R (R (L (C f0)))))))) = LUA.String (unK f0)
to Exp (R (L (Tag (R (R (R (R (L (C U))))))))) = LUA.Vararg
to Exp (R (L (Tag (R (R (R (R (R (L (C f0))))))))))
= LUA.EFunDef ((unI0 . unI) f0)
to Exp (R (L (Tag (R (R (R (R (R (R (L (C f0)))))))))))
= LUA.PrefixExp ((unI0 . unI) f0)
to Exp (R (L (Tag (R (R (R (R (R (R (R (L (C f0))))))))))))
= LUA.TableConst (((fmap (unI0 . unI)) . unD) f0)
to
Exp
(R (L (Tag (R (R (R (R (R (R (R (R (L (C ((:*:) f0
((:*:) f1 f2)))))))))))))))
= LUA.Binop
((unI0 . unI) f0) ((unI0 . unI) f1) ((unI0 . unI) f2)
to
Exp
(R (L (Tag (R (R (R (R (R (R (R (R (R (C ((:*:) f0 f1))))))))))))))
= LUA.Unop ((unI0 . unI) f0) ((unI0 . unI) f1)
to Var (R (R (L (Tag (L (C f0)))))) = LUA.VarName (unK f0)
to Var (R (R (L (Tag (R (L (C ((:*:) f0 f1))))))))
= LUA.Select ((unI0 . unI) f0) ((unI0 . unI) f1)
to Var (R (R (L (Tag (R (R (C ((:*:) f0 f1))))))))
= LUA.SelectName ((unI0 . unI) f0) (unK f1)
to Binop (R (R (R (L (Tag (L (C U))))))) = LUA.Add
to Binop (R (R (R (L (Tag (R (L (C U)))))))) = LUA.Sub
to Binop (R (R (R (L (Tag (R (R (L (C U))))))))) = LUA.Mul
to Binop (R (R (R (L (Tag (R (R (R (L (C U)))))))))) = LUA.Div
to Binop (R (R (R (L (Tag (R (R (R (R (L (C U)))))))))))
= LUA.Exp
to Binop (R (R (R (L (Tag (R (R (R (R (R (L (C U)))))))))))) = LUA.Mod
to Binop (R (R (R (L (Tag (R (R (R (R (R (R (L (C U)))))))))))))
= LUA.Concat
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (L (C U))))))))))))))
= LUA.LT
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (L (C U)))))))))))))))
= LUA.LTE
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (L (C U))))))))))))))))
= LUA.GT
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (R (L (C U)))))))))))))))))
= LUA.GTE
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (R (R (L (C U))))))))))))))))))
= LUA.EQ
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (L (C U)))))))))))))))))))
= LUA.NEQ
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (R (L (C U))))))))))))))))))))
= LUA.And
to
Binop
(R (R (R (L (Tag (R (R (R (R (R (R (R (R (R (R (R (R (R (R (C U))))))))))))))))))))
= LUA.Or
to Unop (R (R (R (R (L (Tag (L (C U)))))))) = LUA.Neg
to Unop (R (R (R (R (L (Tag (R (L (C U))))))))) = LUA.Not
to Unop (R (R (R (R (L (Tag (R (R (C U))))))))) = LUA.Len
to PrefixExp (R (R (R (R (R (L (Tag (L (C f0)))))))))
= LUA.PEVar ((unI0 . unI) f0)
to PrefixExp (R (R (R (R (R (L (Tag (R (L (C f0))))))))))
= LUA.PEFunCall ((unI0 . unI) f0)
to PrefixExp (R (R (R (R (R (L (Tag (R (R (C f0))))))))))
= LUA.Paren ((unI0 . unI) f0)
to
TableField
(R (R (R (R (R (R (L (Tag (L (C ((:*:) f0 f1)))))))))))
= LUA.ExpField ((unI0 . unI) f0) ((unI0 . unI) f1)
to
TableField
(R (R (R (R (R (R (L (Tag (R (L (C ((:*:) f0 f1))))))))))))
= LUA.NamedField (unK f0) ((unI0 . unI) f1)
to TableField (R (R (R (R (R (R (L (Tag (R (R (C f0)))))))))))
= LUA.Field ((unI0 . unI) f0)
to Block (R (R (R (R (R (R (R (L (Tag (C ((:*:) f0 f1)))))))))))
= LUA.Block
(((fmap (unI0 . unI)) . unD) f0)
(((fmap ((fmap (unI0 . unI)) . unD)) . unD) f1)
to
FunName
(R (R (R (R (R (R (R (R (L (Tag (C ((:*:) f0
((:*:) f1 f2)))))))))))))
= LUA.FunName
(unK f0) (((fmap unK) . unD) f1) (((fmap unK) . unD) f2)
to
FunBody
(R (R (R (R (R (R (R (R (R (L (Tag (C ((:*:) f0
((:*:) f1 f2))))))))))))))
= LUA.FunBody
(((fmap unK) . unD) f0) (unK f1) ((unI0 . unI) f2)
to
FunCall
(R (R (R (R (R (R (R (R (R (R (L (Tag (L (C ((:*:) f0
f1)))))))))))))))
= LUA.NormalFunCall ((unI0 . unI) f0) ((unI0 . unI) f1)
to
FunCall
(R (R (R (R (R (R (R (R (R (R (L (Tag (R (C ((:*:) f0
((:*:) f1 f2))))))))))))))))
= LUA.MethodCall ((unI0 . unI) f0) (unK f1) ((unI0 . unI) f2)
to
FunArg
(R (R (R (R (R (R (R (R (R (R (R (Tag (L (C f0))))))))))))))
= LUA.Args (((fmap (unI0 . unI)) . unD) f0)
to
FunArg
(R (R (R (R (R (R (R (R (R (R (R (Tag (R (L (C f0)))))))))))))))
= LUA.TableArg (((fmap (unI0 . unI)) . unD) f0)
to
FunArg
(R (R (R (R (R (R (R (R (R (R (R (Tag (R (R (C f0)))))))))))))))
= LUA.StringArg (unK f0)
instance EqS AST where
eqS Stat Stat = Just Refl
eqS Exp Exp = Just Refl
eqS Var Var = Just Refl
eqS Binop Binop = Just Refl
eqS Unop Unop = Just Refl
eqS PrefixExp PrefixExp = Just Refl
eqS TableField TableField = Just Refl
eqS Block Block = Just Refl
eqS FunName FunName = Just Refl
eqS FunBody FunBody = Just Refl
eqS FunCall FunCall = Just Refl
eqS FunArg FunArg = Just Refl
eqS _ _ = Nothing