{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Futhark.Representation.AST.Attributes.Patterns
(
paramIdent
, paramType
, paramDeclType
, patElemIdent
, patElemType
, setPatElemLore
, patternElements
, patternIdents
, patternContextIdents
, patternValueIdents
, patternNames
, patternValueNames
, patternContextNames
, patternTypes
, patternValueTypes
, patternSize
, basicPattern
)
where
import Futhark.Representation.AST.Syntax
import Futhark.Representation.AST.Attributes.Types (Typed(..), DeclTyped(..))
paramType :: Typed attr => Param attr -> Type
paramType :: Param attr -> Type
paramType = Param attr -> Type
forall t. Typed t => t -> Type
typeOf
paramDeclType :: DeclTyped attr => Param attr -> DeclType
paramDeclType :: Param attr -> DeclType
paramDeclType = Param attr -> DeclType
forall t. DeclTyped t => t -> DeclType
declTypeOf
paramIdent :: Typed attr => Param attr -> Ident
paramIdent :: Param attr -> Ident
paramIdent Param attr
param = VName -> Type -> Ident
Ident (Param attr -> VName
forall attr. Param attr -> VName
paramName Param attr
param) (Param attr -> Type
forall t. Typed t => t -> Type
typeOf Param attr
param)
patElemIdent :: Typed attr => PatElemT attr -> Ident
patElemIdent :: PatElemT attr -> Ident
patElemIdent PatElemT attr
pelem = VName -> Type -> Ident
Ident (PatElemT attr -> VName
forall attr. PatElemT attr -> VName
patElemName PatElemT attr
pelem) (PatElemT attr -> Type
forall t. Typed t => t -> Type
typeOf PatElemT attr
pelem)
patElemType :: Typed attr => PatElemT attr -> Type
patElemType :: PatElemT attr -> Type
patElemType = PatElemT attr -> Type
forall t. Typed t => t -> Type
typeOf
setPatElemLore :: PatElemT oldattr -> newattr -> PatElemT newattr
setPatElemLore :: PatElemT oldattr -> newattr -> PatElemT newattr
setPatElemLore PatElemT oldattr
pe newattr
x = (oldattr -> newattr) -> PatElemT oldattr -> PatElemT newattr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (newattr -> oldattr -> newattr
forall a b. a -> b -> a
const newattr
x) PatElemT oldattr
pe
patternElements :: PatternT attr -> [PatElemT attr]
patternElements :: PatternT attr -> [PatElemT attr]
patternElements PatternT attr
pat = PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternContextElements PatternT attr
pat [PatElemT attr] -> [PatElemT attr] -> [PatElemT attr]
forall a. [a] -> [a] -> [a]
++ PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternValueElements PatternT attr
pat
patternIdents :: Typed attr => PatternT attr -> [Ident]
patternIdents :: PatternT attr -> [Ident]
patternIdents PatternT attr
pat = PatternT attr -> [Ident]
forall attr. Typed attr => PatternT attr -> [Ident]
patternContextIdents PatternT attr
pat [Ident] -> [Ident] -> [Ident]
forall a. [a] -> [a] -> [a]
++ PatternT attr -> [Ident]
forall attr. Typed attr => PatternT attr -> [Ident]
patternValueIdents PatternT attr
pat
patternContextIdents :: Typed attr => PatternT attr -> [Ident]
patternContextIdents :: PatternT attr -> [Ident]
patternContextIdents = (PatElemT attr -> Ident) -> [PatElemT attr] -> [Ident]
forall a b. (a -> b) -> [a] -> [b]
map PatElemT attr -> Ident
forall attr. Typed attr => PatElemT attr -> Ident
patElemIdent ([PatElemT attr] -> [Ident])
-> (PatternT attr -> [PatElemT attr]) -> PatternT attr -> [Ident]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternContextElements
patternValueIdents :: Typed attr => PatternT attr -> [Ident]
patternValueIdents :: PatternT attr -> [Ident]
patternValueIdents = (PatElemT attr -> Ident) -> [PatElemT attr] -> [Ident]
forall a b. (a -> b) -> [a] -> [b]
map PatElemT attr -> Ident
forall attr. Typed attr => PatElemT attr -> Ident
patElemIdent ([PatElemT attr] -> [Ident])
-> (PatternT attr -> [PatElemT attr]) -> PatternT attr -> [Ident]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternValueElements
patternNames :: PatternT attr -> [VName]
patternNames :: PatternT attr -> [VName]
patternNames = (PatElemT attr -> VName) -> [PatElemT attr] -> [VName]
forall a b. (a -> b) -> [a] -> [b]
map PatElemT attr -> VName
forall attr. PatElemT attr -> VName
patElemName ([PatElemT attr] -> [VName])
-> (PatternT attr -> [PatElemT attr]) -> PatternT attr -> [VName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternElements
patternContextNames :: PatternT attr -> [VName]
patternContextNames :: PatternT attr -> [VName]
patternContextNames = (PatElemT attr -> VName) -> [PatElemT attr] -> [VName]
forall a b. (a -> b) -> [a] -> [b]
map PatElemT attr -> VName
forall attr. PatElemT attr -> VName
patElemName ([PatElemT attr] -> [VName])
-> (PatternT attr -> [PatElemT attr]) -> PatternT attr -> [VName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternContextElements
patternValueNames :: PatternT attr -> [VName]
patternValueNames :: PatternT attr -> [VName]
patternValueNames = (PatElemT attr -> VName) -> [PatElemT attr] -> [VName]
forall a b. (a -> b) -> [a] -> [b]
map PatElemT attr -> VName
forall attr. PatElemT attr -> VName
patElemName ([PatElemT attr] -> [VName])
-> (PatternT attr -> [PatElemT attr]) -> PatternT attr -> [VName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [PatElemT attr]
forall attr. PatternT attr -> [PatElemT attr]
patternValueElements
patternTypes :: Typed attr => PatternT attr -> [Type]
patternTypes :: PatternT attr -> [Type]
patternTypes = (Ident -> Type) -> [Ident] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Ident -> Type
identType ([Ident] -> [Type])
-> (PatternT attr -> [Ident]) -> PatternT attr -> [Type]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [Ident]
forall attr. Typed attr => PatternT attr -> [Ident]
patternIdents
patternValueTypes :: Typed attr => PatternT attr -> [Type]
patternValueTypes :: PatternT attr -> [Type]
patternValueTypes = (Ident -> Type) -> [Ident] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Ident -> Type
identType ([Ident] -> [Type])
-> (PatternT attr -> [Ident]) -> PatternT attr -> [Type]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PatternT attr -> [Ident]
forall attr. Typed attr => PatternT attr -> [Ident]
patternValueIdents
patternSize :: PatternT attr -> Int
patternSize :: PatternT attr -> Int
patternSize (Pattern [PatElemT attr]
context [PatElemT attr]
values) = [PatElemT attr] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PatElemT attr]
context Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [PatElemT attr] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PatElemT attr]
values
basicPattern :: [Ident] -> [Ident] -> PatternT Type
basicPattern :: [Ident] -> [Ident] -> PatternT Type
basicPattern [Ident]
context [Ident]
values =
[PatElemT Type] -> [PatElemT Type] -> PatternT Type
forall attr. [PatElemT attr] -> [PatElemT attr] -> PatternT attr
Pattern ((Ident -> PatElemT Type) -> [Ident] -> [PatElemT Type]
forall a b. (a -> b) -> [a] -> [b]
map Ident -> PatElemT Type
patElem [Ident]
context) ((Ident -> PatElemT Type) -> [Ident] -> [PatElemT Type]
forall a b. (a -> b) -> [a] -> [b]
map Ident -> PatElemT Type
patElem [Ident]
values)
where patElem :: Ident -> PatElemT Type
patElem (Ident VName
name Type
t) = VName -> Type -> PatElemT Type
forall attr. VName -> attr -> PatElemT attr
PatElem VName
name Type
t