{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module NewCode where
import Data.Data
import Data.Default
import Debug.Hoed.Pure
import GHC.Generics (Generic)
import Language.Haskell.Exts.Syntax
import SrcLocs
#ifdef DEBUG
import Language.Haskell.Exts.Observe ()
#endif
data Code
= ReturnCode S
| ArrCode S Int [Binding]
| ComposeCode
| OpCode
| Loc S
deriving (Eq, Data, Ord, Generic, Show)
instance Default Code where
def = Loc def
instance Observable Code
getLoc :: Code -> S
getLoc (Loc s) = s
getLoc other = error $ "getLoc: " ++ show other
pattern ReturnA l = Var OpCode (Special OpCode (ExprHole (ReturnCode l)))
pattern Arr l i pat bb e = Lambda (ArrCode l i bb) [pat] e
pattern Compose a bb c <- List ComposeCode ( split -> (a,bb,c) )
where
Compose a bb c = List ComposeCode (a : bb ++ [c])
pattern Op e args = List OpCode (e:args)
split :: [c] -> (c, [c], c)
split (h:rest@(_:_)) = (h, init rest, last rest)
split _ = error "Compose: unreachable"
data Binding = BindLet (Binds Code) | BindCase (Pat Code) (Exp Code)
deriving (Eq, Data, Ord, Generic, Show)
instance Observable Binding