is-0.4: Generic pattern predicates

Safe HaskellNone
LanguageHaskell2010

Data.Generics.Is.TH

Contents

Synopsis

Documentation

Predicates may be generated inline from a constructor name or quoted pattern, or in bulk from a type declaration.

You must enable the TemplateHaskell extension to use the functions in this module.

From constructors

is :: Name -> Q Exp Source #

Given a constructor (or pattern synonym) for type T, is generates a function of type T → Bool.

The function evaluates its argument to WHNF, and returns True if the head constructor matches the given one, False otherwise.

>>> $(is 'Just) (Just 5)
True

isNot :: Name -> Q Exp Source #

$(isNot 'Con) ≡ not . $(is 'Con)
>>> $(isNot '(:)) [1,2,3]
False

From patterns

isP :: Q Pat -> Q Exp Source #

Given a pattern for type T, isP generates a function of type T → Bool.

The function returns True if the expression matches the pattern; a and False otherwise.

$(isP [p| Con{} |]) ≡ $(is 'Con)
>>> $(isP [p| Just{} |]) Nothing
False

isNotP :: Q Pat -> Q Exp Source #

$(isNotP [p| P |]) ≡ not . $(isP [p| P |])

From type declaration

Given a type T, for each constructor K, we can declare predicates isK, isNotK : T → Bool.

Type T can be a newtype, data, or GADT declaration.

Constructors with non-alphanumeric names (e.g. :+:) are ignored silently. As a workaround, we suggest giving the constructors alphanumeric names, and creating pattern synonyms with the desired symbolic names.

data E a where
   Plus     :: E Int -> E Int -> E Int
   And      :: E Bool -> E Bool -> E Bool
   Lit      :: a -> E a
   (:*:)    :: (Num a) => E a -> E a -> E a
   Showable :: (Show a) => a -> E String

pattern a :+: b = Plus a b

makePredicates :: Name -> Q [Dec] Source #

Generate predicates of the form isK

>>> $(makePredicates ''E)
>>> isPlus (Plus (Lit 1) (Lit 2))
True

makePredicatesNot :: Name -> Q [Dec] Source #

Generate predicates of the form isNotK

>>> $(makePredicatesNot ''E)
>>> isNotAnd (Showable True)
True

makePredicatesAll :: Name -> Q [Dec] Source #

Generate predicates of both forms, isK and isNotK

$(makePredicatesAll ''E) ≡ $(makePredicates ''E) ; $(makePredicatesNot ''E)