{-# LANGuAGE CPP #-}
module Stan.Pattern.Type
(
PatternType (..)
, (|->)
, (|::)
, listPattern
, nonEmptyPattern
, listFunPattern
, integerPattern
, naturalPattern
, charPattern
, stringPattern
, textPattern
, foldableTypesPatterns
, foldableMethodsPatterns
) where
import Stan.NameMeta (NameMeta (..), baseNameFrom, ghcPrimNameFrom, primTypeMeta, textNameFrom)
import Stan.Pattern.Edsl (PatternBool (..))
data PatternType
= PatternTypeName !NameMeta ![PatternType]
| PatternTypeFun !PatternType !PatternType
| PatternTypeAnything
| PatternTypeOr !PatternType !PatternType
| PatternTypeAnd !PatternType !PatternType
| PatternTypeNeg !PatternType
deriving stock (Int -> PatternType -> ShowS
[PatternType] -> ShowS
PatternType -> String
(Int -> PatternType -> ShowS)
-> (PatternType -> String)
-> ([PatternType] -> ShowS)
-> Show PatternType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PatternType -> ShowS
showsPrec :: Int -> PatternType -> ShowS
$cshow :: PatternType -> String
show :: PatternType -> String
$cshowList :: [PatternType] -> ShowS
showList :: [PatternType] -> ShowS
Show, PatternType -> PatternType -> Bool
(PatternType -> PatternType -> Bool)
-> (PatternType -> PatternType -> Bool) -> Eq PatternType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PatternType -> PatternType -> Bool
== :: PatternType -> PatternType -> Bool
$c/= :: PatternType -> PatternType -> Bool
/= :: PatternType -> PatternType -> Bool
Eq)
instance PatternBool PatternType where
(?) :: PatternType
? :: PatternType
(?) = PatternType
PatternTypeAnything
neg :: PatternType -> PatternType
neg :: PatternType -> PatternType
neg = PatternType -> PatternType
PatternTypeNeg
(|||) :: PatternType -> PatternType -> PatternType
||| :: PatternType -> PatternType -> PatternType
(|||) = PatternType -> PatternType -> PatternType
PatternTypeOr
(&&&) :: PatternType -> PatternType -> PatternType
&&& :: PatternType -> PatternType -> PatternType
(&&&) = PatternType -> PatternType -> PatternType
PatternTypeAnd
infixr 4 |->
(|->) :: PatternType -> PatternType -> PatternType
|-> :: PatternType -> PatternType -> PatternType
(|->) = PatternType -> PatternType -> PatternType
PatternTypeFun
infix 5 |::
(|::) :: NameMeta -> [PatternType] -> PatternType
|:: :: NameMeta -> [PatternType] -> PatternType
(|::) = NameMeta -> [PatternType] -> PatternType
PatternTypeName
listPattern :: PatternType
listPattern :: PatternType
listPattern =
NameMeta
listNameMeta NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?) ]
PatternType -> PatternType -> PatternType
forall a. PatternBool a => a -> a -> a
|||
Text
"String" Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"GHC.Base" NameMeta -> [PatternType] -> PatternType
|:: []
where
listNameMeta :: NameMeta
#if __GLASGOW_HASKELL__ < 906
listNameMeta = primTypeMeta "[]"
#elif __GLASGOW_HASKELL__ >= 906
listNameMeta :: NameMeta
listNameMeta = Text -> NameMeta
primTypeMeta Text
"List"
#endif
nonEmptyPattern :: PatternType
nonEmptyPattern :: PatternType
nonEmptyPattern = Text
"NonEmpty" Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"GHC.Base" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?) ]
listFunPattern :: PatternType
listFunPattern :: PatternType
listFunPattern = PatternType
listPattern PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
#if __GLASGOW_HASKELL__ < 900
integerPattern :: PatternType
integerPattern = NameMeta
{ nameMetaName = "Integer"
, nameMetaModuleName = "GHC.Integer.Type"
, nameMetaPackage = "integer-wired-in"
} |:: []
naturalPattern :: PatternType
naturalPattern = "Natural" `baseNameFrom` "GHC.Natural" |:: []
#elif __GLASGOW_HASKELL__ >= 900
integerPattern :: PatternType
integerPattern :: PatternType
integerPattern = NameMeta
{ nameMetaName :: Text
nameMetaName = Text
"Integer"
, nameMetaModuleName :: ModuleName
nameMetaModuleName = ModuleName
"GHC.Num.Integer"
, nameMetaPackage :: Text
nameMetaPackage = Text
"ghc-bignum"
} NameMeta -> [PatternType] -> PatternType
|:: []
naturalPattern :: PatternType
naturalPattern :: PatternType
naturalPattern = NameMeta
{ nameMetaName :: Text
nameMetaName = Text
"Natural"
, nameMetaModuleName :: ModuleName
nameMetaModuleName = ModuleName
"GHC.Num.Natural"
, nameMetaPackage :: Text
nameMetaPackage = Text
"ghc-bignum"
} NameMeta -> [PatternType] -> PatternType
|:: []
#endif
charPattern :: PatternType
charPattern :: PatternType
charPattern = Text -> NameMeta
primTypeMeta Text
"Char" NameMeta -> [PatternType] -> PatternType
|:: []
stringPattern :: PatternType
stringPattern :: PatternType
stringPattern = Text
"String" Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"GHC.Base" NameMeta -> [PatternType] -> PatternType
|:: []
textPattern :: PatternType
textPattern :: PatternType
textPattern = Text
"Text" Text -> ModuleName -> NameMeta
`textNameFrom` ModuleName
"Data.Text.Internal" NameMeta -> [PatternType] -> PatternType
|:: []
foldableTypesPatterns :: NonEmpty PatternType
foldableTypesPatterns :: NonEmpty PatternType
foldableTypesPatterns = PatternType
maybePattern PatternType -> [PatternType] -> NonEmpty PatternType
forall a. a -> [a] -> NonEmpty a
:| [PatternType
eitherPattern, PatternType
pairPattern]
maybePattern :: PatternType
maybePattern :: PatternType
maybePattern = Text
"Maybe" Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"GHC.Maybe" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?) ]
eitherPattern :: PatternType
eitherPattern :: PatternType
eitherPattern = Text
"Either" Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"Data.Either" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?), PatternType
forall a. PatternBool a => a
(?) ]
pairPattern :: PatternType
#if __GLASGOW_HASKELL__ < 908
pairPattern :: PatternType
pairPattern = Text
"(,)" Text -> ModuleName -> NameMeta
`ghcPrimNameFrom` ModuleName
ghcTuple NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?), PatternType
forall a. PatternBool a => a
(?) ]
#elif __GLASGOW_HASKELL__ >= 908
pairPattern = "Tuple2" `ghcPrimNameFrom` ghcTuple |:: [ (?), (?) ]
#endif
where
#if __GLASGOW_HASKELL__ < 906
ghcTuple = "GHC.Tuple"
#elif __GLASGOW_HASKELL__ >= 906
ghcTuple :: ModuleName
ghcTuple = ModuleName
"GHC.Tuple.Prim"
#endif
foldableMethodsPatterns :: NonEmpty (NameMeta, PatternType -> PatternType)
foldableMethodsPatterns :: NonEmpty (NameMeta, PatternType -> PatternType)
foldableMethodsPatterns =
Text -> NameMeta
method Text
"fold" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` (\PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)) (NameMeta, PatternType -> PatternType)
-> [(NameMeta, PatternType -> PatternType)]
-> NonEmpty (NameMeta, PatternType -> PatternType)
forall a. a -> [a] -> NonEmpty a
:|
[ Text -> NameMeta
method Text
"foldMap" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldMap'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldr" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldr'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldl" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldl'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldr1" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"foldl1" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"toList" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"null" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"length" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"elem" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
forall a. PatternBool a => a
(?) PatternType -> PatternType -> PatternType
|-> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"maximum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"minimum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"sum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method Text
"product" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
]
where
ofType :: a -> b -> (a, b)
ofType :: forall a b. a -> b -> (a, b)
ofType = (,)
method :: Text -> NameMeta
method :: Text -> NameMeta
method Text
name = Text
name Text -> ModuleName -> NameMeta
`baseNameFrom` ModuleName
"Data.Foldable"