module Language.Haskell.Exts.Extension (
Extension(..),
ExtScheme(..), Enabled(..),
impliesExts
) where
data Extension
= OverlappingInstances
| UndecidableInstances
| IncoherentInstances
| RecursiveDo
| ParallelListComp
| MultiParamTypeClasses
| NoMonomorphismRestriction
| FunctionalDependencies
| Rank2Types
| RankNTypes
| PolymorphicComponents
| ExistentialQuantification
| ScopedTypeVariables
| ImplicitParams
| FlexibleContexts
| FlexibleInstances
| EmptyDataDecls
| CPP
| ExplicitForallTypes
| KindSignatures
| BangPatterns
| TypeSynonymInstances
| TemplateHaskell
| ForeignFunctionInterface
| Arrows
| Generics
| NoImplicitPrelude
| NamedFieldPuns
| PatternGuards
| GeneralizedNewtypeDeriving
| ExtensibleRecords
| RestrictedTypeSynonyms
| HereDocuments
| MagicHash
| TypeFamilies
| StandaloneDeriving
| UnicodeSyntax
| PatternSignatures
| UnliftedFFITypes
| LiberalTypeSynonyms
| TypeOperators
| RecordWildCards
| RecordPuns
| DisambiguateRecordFields
| OverloadedStrings
| GADTs
| MonoPatBinds
| RelaxedPolyRec
| ExtendedDefaultRules
| UnboxedTuples
| DeriveDataTypeable
| ConstrainedClassMethods
| PackageImports
| ImpredicativeTypes
| NewQualifiedOperators
| PostfixOperators
| QuasiQuotes
| TransformListComp
| ViewPatterns
| XmlSyntax
| RegularPatterns
deriving (Eq, Show, Read)
impliesExts :: Extension -> [Extension]
impliesExts e@TypeFamilies = [e, KindSignatures]
impliesExts e | e `elem` [Rank2Types, RankNTypes, PolymorphicComponents, LiberalTypeSynonyms] = [e, ExplicitForallTypes]
impliesExts e = [e]
data ExtScheme = Any [Extension] | All [Extension]
deriving (Eq,Show)
type MExtScheme = Maybe ExtScheme
class Enabled a where
isEnabled :: a -> [Extension] -> Bool
instance Enabled Extension where
isEnabled = elem
instance Enabled ExtScheme where
isEnabled (Any exts) enabled = any (`elem` enabled) exts
isEnabled (All exts) enabled = all (`elem` enabled) exts
instance Enabled a => Enabled (Maybe a) where
isEnabled Nothing = const True
isEnabled (Just a) = isEnabled a