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
showList :: [PatternType] -> ShowS
$cshowList :: [PatternType] -> ShowS
show :: PatternType -> String
$cshow :: PatternType -> String
showsPrec :: Int -> PatternType -> ShowS
$cshowsPrec :: Int -> PatternType -> ShowS
Show, PatternType -> PatternType -> Bool
(PatternType -> PatternType -> Bool)
-> (PatternType -> PatternType -> Bool) -> Eq PatternType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PatternType -> PatternType -> Bool
$c/= :: PatternType -> PatternType -> Bool
== :: PatternType -> PatternType -> Bool
$c== :: 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
|||
"String" Text -> ModuleName -> NameMeta
`baseNameFrom` "GHC.Base" NameMeta -> [PatternType] -> PatternType
|:: []
where
listNameMeta :: NameMeta
listNameMeta :: NameMeta
listNameMeta = Text -> NameMeta
primTypeMeta "[]"
nonEmptyPattern :: PatternType
nonEmptyPattern :: PatternType
nonEmptyPattern = "NonEmpty" Text -> ModuleName -> NameMeta
`baseNameFrom` "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
(?)
integerPattern :: PatternType
integerPattern :: PatternType
integerPattern = $WNameMeta :: Text -> ModuleName -> Text -> NameMeta
NameMeta
{ nameMetaName :: Text
nameMetaName = "Integer"
, nameMetaModuleName :: ModuleName
nameMetaModuleName = "GHC.Integer.Type"
, nameMetaPackage :: Text
nameMetaPackage = "integer-wired-in"
} NameMeta -> [PatternType] -> PatternType
|:: []
naturalPattern :: PatternType
naturalPattern :: PatternType
naturalPattern = "Natural" Text -> ModuleName -> NameMeta
`baseNameFrom` "GHC.Natural" NameMeta -> [PatternType] -> PatternType
|:: []
charPattern :: PatternType
charPattern :: PatternType
charPattern = Text -> NameMeta
primTypeMeta "Char" NameMeta -> [PatternType] -> PatternType
|:: []
stringPattern :: PatternType
stringPattern :: PatternType
stringPattern = "String" Text -> ModuleName -> NameMeta
`baseNameFrom` "GHC.Base" NameMeta -> [PatternType] -> PatternType
|:: []
textPattern :: PatternType
textPattern :: PatternType
textPattern = "Text" Text -> ModuleName -> NameMeta
`textNameFrom` "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 = "Maybe" Text -> ModuleName -> NameMeta
`baseNameFrom` "GHC.Maybe" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?) ]
eitherPattern :: PatternType
eitherPattern :: PatternType
eitherPattern = "Either" Text -> ModuleName -> NameMeta
`baseNameFrom` "Data.Either" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?), PatternType
forall a. PatternBool a => a
(?) ]
pairPattern :: PatternType
pairPattern :: PatternType
pairPattern = "(,)" Text -> ModuleName -> NameMeta
`ghcPrimNameFrom` "GHC.Tuple" NameMeta -> [PatternType] -> PatternType
|:: [ PatternType
forall a. PatternBool a => a
(?), PatternType
forall a. PatternBool a => a
(?) ]
foldableMethodsPatterns :: NonEmpty (NameMeta, PatternType -> PatternType)
foldableMethodsPatterns :: NonEmpty (NameMeta, PatternType -> PatternType)
foldableMethodsPatterns =
Text -> NameMeta
method "fold" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` (\t :: 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 "foldMap" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldMap'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldr" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldr'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldl" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldl'" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldr1" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "foldl1" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "toList" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "null" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "length" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "elem" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: 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 "maximum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "minimum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "sum" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
, Text -> NameMeta
method "product" NameMeta
-> (PatternType -> PatternType)
-> (NameMeta, PatternType -> PatternType)
forall a b. a -> b -> (a, b)
`ofType` \t :: PatternType
t -> PatternType
t PatternType -> PatternType -> PatternType
|-> PatternType
forall a. PatternBool a => a
(?)
]
where
ofType :: a -> b -> (a, b)
ofType :: a -> b -> (a, b)
ofType = (,)
method :: Text -> NameMeta
method :: Text -> NameMeta
method name :: Text
name = Text
name Text -> ModuleName -> NameMeta
`baseNameFrom` "Data.Foldable"