module Lang.Common where import FP import qualified FP.Pretty as P newtype Name = Name { getName :: String } deriving (Eq, Ord) data GName = GName { gnameMark :: Maybe Int , gname :: Name } deriving (Eq, Ord) newtype LocNum = LocNum Int deriving (Eq, Ord, PartialOrder, Peano) newtype BdrNum = BdrNum Int deriving (Eq, Ord, PartialOrder, Peano) type SName = Stamped BdrNum Name type SGName = Stamped BdrNum GName sgNameFromSName :: SName -> SGName sgNameFromSName (Stamped i x) = Stamped i $ GName Nothing x data Lit = I Int | B Bool deriving (Eq, Ord) instance PartialOrder Lit where pcompare = discreteOrder makePrisms ''Lit data Op = Add1 | Sub1 | IsNonNeg deriving (Eq, Ord) instance PartialOrder Op where pcompare = discreteOrder instance Pretty Name where pretty (Name s) = P.bdr s instance Pretty LocNum where pretty (LocNum i) = P.pun $ ptoString i instance Pretty BdrNum where pretty (BdrNum i) = P.format (P.setFG 2) $ P.text $ ptoString i instance Pretty GName where pretty (GName iM s) = exec [ pretty s , maybeElimOn iM (return ()) $ \ i -> exec [P.pun "#", P.pun $ toString i] ] instance Pretty Lit where pretty (I i) = pretty i pretty (B b) = pretty b instance Pretty Op where pretty Add1 = P.key "+1" pretty Sub1 = P.key "-1" pretty IsNonNeg = P.key ">=0?" data VarLam n e = VarLam [n] e instance (Pretty n, Pretty e) => Pretty (VarLam n e) where pretty (VarLam xs e) = P.atLevel 0 $ P.nest 2 $ P.hvsep [ P.hsep $ concat [ single $ P.key "λ" , map pretty xs , single $ P.pun "." ] , pretty e ]