{-# LANGUAGE CPP #-}
module Stan.Pattern.Ast
(
PatternAst (..)
, Literal (..)
, namesToPatternAst
, anyNamesToPatternAst
, app
, opApp
, constructor
, constructorNameIdentifier
, dataDecl
, fixity
, fun
, guardBranch
, lazyField
, range
, rhs
, tuple
, typeSig
, case'
, lambdaCase
, patternMatchBranch
, patternMatchArrow
, patternMatch_
, literalPat
, wildPat
, literalAnns
) where
import Stan.Ghc.Compat (FastString)
import Stan.Hie.Compat (DeclType (..))
import Stan.NameMeta (NameMeta (..))
import Stan.Pattern.Edsl (PatternBool (..))
import Stan.Pattern.Type (PatternType)
import qualified Data.Set as Set
data PatternAst
= PatternAstConstant !Literal
| PatternAstName !NameMeta !PatternType
| PatternAstVarName !String
| PatternAstNode
!(Set (FastString, FastString))
| PatternAstNodeExact
!(Set (FastString, FastString))
![PatternAst]
| PatternAstAnything
| PatternAstOr !PatternAst !PatternAst
| PatternAstAnd !PatternAst !PatternAst
| PatternAstNeg !PatternAst
| PatternAstIdentifierDetailsDecl !DeclType
deriving stock (Int -> PatternAst -> ShowS
[PatternAst] -> ShowS
PatternAst -> String
(Int -> PatternAst -> ShowS)
-> (PatternAst -> String)
-> ([PatternAst] -> ShowS)
-> Show PatternAst
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PatternAst] -> ShowS
$cshowList :: [PatternAst] -> ShowS
show :: PatternAst -> String
$cshow :: PatternAst -> String
showsPrec :: Int -> PatternAst -> ShowS
$cshowsPrec :: Int -> PatternAst -> ShowS
Show, PatternAst -> PatternAst -> Bool
(PatternAst -> PatternAst -> Bool)
-> (PatternAst -> PatternAst -> Bool) -> Eq PatternAst
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PatternAst -> PatternAst -> Bool
$c/= :: PatternAst -> PatternAst -> Bool
== :: PatternAst -> PatternAst -> Bool
$c== :: PatternAst -> PatternAst -> Bool
Eq)
instance PatternBool PatternAst where
(?) :: PatternAst
? :: PatternAst
(?) = PatternAst
PatternAstAnything
neg :: PatternAst -> PatternAst
neg :: PatternAst -> PatternAst
neg = PatternAst -> PatternAst
PatternAstNeg
(|||) :: PatternAst -> PatternAst -> PatternAst
||| :: PatternAst -> PatternAst -> PatternAst
(|||) = PatternAst -> PatternAst -> PatternAst
PatternAstOr
(&&&) :: PatternAst -> PatternAst -> PatternAst
&&& :: PatternAst -> PatternAst -> PatternAst
(&&&) = PatternAst -> PatternAst -> PatternAst
PatternAstAnd
data Literal
= ExactNum !Int
| ExactStr !ByteString
| PrefixStr !ByteString
| ContainStr !ByteString
| AnyLiteral
deriving stock (Int -> Literal -> ShowS
[Literal] -> ShowS
Literal -> String
(Int -> Literal -> ShowS)
-> (Literal -> String) -> ([Literal] -> ShowS) -> Show Literal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Literal] -> ShowS
$cshowList :: [Literal] -> ShowS
show :: Literal -> String
$cshow :: Literal -> String
showsPrec :: Int -> Literal -> ShowS
$cshowsPrec :: Int -> Literal -> ShowS
Show, Literal -> Literal -> Bool
(Literal -> Literal -> Bool)
-> (Literal -> Literal -> Bool) -> Eq Literal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Literal -> Literal -> Bool
$c/= :: Literal -> Literal -> Bool
== :: Literal -> Literal -> Bool
$c== :: Literal -> Literal -> Bool
Eq)
namesToPatternAst :: NonEmpty (NameMeta, PatternType) -> PatternAst
namesToPatternAst :: NonEmpty (NameMeta, PatternType) -> PatternAst
namesToPatternAst ((nm :: NameMeta
nm, pat :: PatternType
pat) :| []) = NameMeta -> PatternType -> PatternAst
PatternAstName NameMeta
nm PatternType
pat
namesToPatternAst ((nm :: NameMeta
nm, pat :: PatternType
pat) :| x :: (NameMeta, PatternType)
x:rest :: [(NameMeta, PatternType)]
rest) = PatternAst -> PatternAst -> PatternAst
PatternAstOr
(NameMeta -> PatternType -> PatternAst
PatternAstName NameMeta
nm PatternType
pat)
(NonEmpty (NameMeta, PatternType) -> PatternAst
namesToPatternAst (NonEmpty (NameMeta, PatternType) -> PatternAst)
-> NonEmpty (NameMeta, PatternType) -> PatternAst
forall a b. (a -> b) -> a -> b
$ (NameMeta, PatternType)
x (NameMeta, PatternType)
-> [(NameMeta, PatternType)] -> NonEmpty (NameMeta, PatternType)
forall a. a -> [a] -> NonEmpty a
:| [(NameMeta, PatternType)]
rest)
anyNamesToPatternAst :: NonEmpty NameMeta -> PatternAst
anyNamesToPatternAst :: NonEmpty NameMeta -> PatternAst
anyNamesToPatternAst = NonEmpty (NameMeta, PatternType) -> PatternAst
namesToPatternAst (NonEmpty (NameMeta, PatternType) -> PatternAst)
-> (NonEmpty NameMeta -> NonEmpty (NameMeta, PatternType))
-> NonEmpty NameMeta
-> PatternAst
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NameMeta -> (NameMeta, PatternType))
-> NonEmpty NameMeta -> NonEmpty (NameMeta, PatternType)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (, PatternType
forall a. PatternBool a => a
(?))
app :: PatternAst -> PatternAst -> PatternAst
app :: PatternAst -> PatternAst -> PatternAst
app f :: PatternAst
f x :: PatternAst
x = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsApp", "HsExpr")) [PatternAst
f, PatternAst
x]
opApp :: PatternAst -> PatternAst -> PatternAst -> PatternAst
opApp :: PatternAst -> PatternAst -> PatternAst -> PatternAst
opApp x :: PatternAst
x op :: PatternAst
op y :: PatternAst
y = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("OpApp", "HsExpr")) [PatternAst
x, PatternAst
op, PatternAst
y]
range :: PatternAst -> PatternAst -> PatternAst
range :: PatternAst -> PatternAst -> PatternAst
range from :: PatternAst
from to :: PatternAst
to = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("ArithSeq", "HsExpr")) [PatternAst
from, PatternAst
to]
lambdaCase :: PatternAst
lambdaCase :: PatternAst
lambdaCase = Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsLamCase", "HsExpr"))
case' :: PatternAst
case' :: PatternAst
case' = Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsCase", "HsExpr"))
patternMatchBranch :: PatternAst
patternMatchBranch :: PatternAst
patternMatchBranch = Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("Match", "Match"))
wildPat :: PatternAst
wildPat :: PatternAst
wildPat = Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("WildPat", "Pat"))
literalPat :: PatternAst
literalPat :: PatternAst
literalPat = Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("NPat", "Pat"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
||| Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("LitPat", "Pat"))
patternMatch_ :: PatternAst -> PatternAst
patternMatch_ :: PatternAst -> PatternAst
patternMatch_ val :: PatternAst
val = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("Match", "Match"))
#if __GLASGOW_HASKELL__ >= 810
$ wildPat :
#endif
[PatternAst -> PatternAst
patternMatchArrow PatternAst
val]
patternMatchArrow :: PatternAst -> PatternAst
patternMatchArrow :: PatternAst -> PatternAst
patternMatchArrow x :: PatternAst
x = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("GRHS", "GRHS")) [PatternAst
x]
fixity :: PatternAst
fixity :: PatternAst
fixity = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("FixitySig", "FixitySig")
typeSig :: PatternAst
typeSig :: PatternAst
typeSig = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("TypeSig", "Sig")
fun :: PatternAst
fun :: PatternAst
fun = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ [(FastString, FastString)] -> Set (FastString, FastString)
forall a. Ord a => [a] -> Set a
Set.fromList
[ ("AbsBinds", "HsBindLR")
, ("FunBind", "HsBindLR")
, ("Match", "Match")
]
dataDecl :: PatternAst
dataDecl :: PatternAst
dataDecl = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("DataDecl", "TyClDecl")
constructor :: PatternAst
constructor :: PatternAst
constructor = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("ConDeclH98", "ConDecl")
constructorNameIdentifier :: PatternAst
constructorNameIdentifier :: PatternAst
constructorNameIdentifier = DeclType -> PatternAst
PatternAstIdentifierDetailsDecl DeclType
ConDec
lazyField :: PatternAst
lazyField :: PatternAst
lazyField = PatternAst
lazyRecordField PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
||| PatternAst
type_
type_ :: PatternAst
type_ :: PatternAst
type_ =
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsTyVar", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsAppTy", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsParTy", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsTupleTy", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsListTy", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsFunTy", "HsType"))
lazyRecordField :: PatternAst
lazyRecordField :: PatternAst
lazyRecordField = Set (FastString, FastString) -> [PatternAst] -> PatternAst
PatternAstNodeExact
(OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("ConDeclField", "ConDeclField"))
[ Set (FastString, FastString) -> PatternAst
PatternAstNode
([Item (Set (FastString, FastString))]
-> Set (FastString, FastString)
forall l. IsList l => [Item l] -> l
fromList
[ ("AbsBinds", "HsBindLR")
, ("FunBind", "HsBindLR")
]
)
, PatternAst
type_
]
tuple :: PatternAst
tuple :: PatternAst
tuple =
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("HsTupleTy", "HsType"))
PatternAst -> PatternAst -> PatternAst
forall a. PatternBool a => a -> a -> a
|||
Set (FastString, FastString) -> PatternAst
PatternAstNode (OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("ExplicitTuple", "HsExpr"))
guardBranch :: PatternAst
guardBranch :: PatternAst
guardBranch = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("BodyStmt", "StmtLR")
rhs :: PatternAst
rhs :: PatternAst
rhs = Set (FastString, FastString) -> PatternAst
PatternAstNode (Set (FastString, FastString) -> PatternAst)
-> Set (FastString, FastString) -> PatternAst
forall a b. (a -> b) -> a -> b
$ OneItem (Set (FastString, FastString))
-> Set (FastString, FastString)
forall x. One x => OneItem x -> x
one ("GRHS", "GRHS")
literalAnns :: (FastString, FastString)
literalAnns :: (FastString, FastString)
literalAnns = ("HsOverLit", "HsExpr")