ghc-typelits-presburger 0.6.2.0 → 0.7.0.0
raw patch · 5 files changed
+185/−42 lines, 5 filesdep ~ghcPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ghc
API changes (from Hackage documentation)
- GHC.TypeLits.Presburger.Compat: [dynflagsPlugin] :: Plugin -> [CommandLineOption] -> DynFlags -> IO DynFlags
- GHC.TypeLits.Presburger.Compat: checkRecTc :: RecTcChecker -> TyCon -> Maybe RecTcChecker
- GHC.TypeLits.Presburger.Compat: data RecTcChecker
- GHC.TypeLits.Presburger.Compat: defaultRecTcMaxBound :: Int
- GHC.TypeLits.Presburger.Compat: initRecTc :: RecTcChecker
- GHC.TypeLits.Presburger.Compat: instance Outputable.Outputable GHC.TypeLits.Presburger.Compat.TvSubst
- GHC.TypeLits.Presburger.Compat: isDataProductTyCon_maybe :: TyCon -> Maybe DataCon
- GHC.TypeLits.Presburger.Compat: isDataSumTyCon_maybe :: TyCon -> Maybe [DataCon]
- GHC.TypeLits.Presburger.Compat: isProductTyCon :: TyCon -> Bool
- GHC.TypeLits.Presburger.Compat: pattern IsBoot :: IsBootInterface
- GHC.TypeLits.Presburger.Compat: pattern NotBoot :: IsBootInterface
- GHC.TypeLits.Presburger.Compat: setRecTcMaxBound :: Int -> RecTcChecker -> RecTcChecker
- GHC.TypeLits.Presburger.Compat: tcInferApps :: TcTyMode -> LHsType GhcRn -> TcType -> [LHsTypeArg GhcRn] -> TcM (TcType, TcKind)
- GHC.TypeLits.Presburger.Compat: tyConTyVarBinders :: [TyConBinder] -> [TyVarBinder]
- GHC.TypeLits.Presburger.Compat: type IsBootInterface = Bool
- GHC.TypeLits.Presburger.Compat: typeNatLeqTyCon :: TyCon
+ GHC.TypeLits.Presburger.Compat: DataFamilyInst :: TyCon -> FamFlavor
+ GHC.TypeLits.Presburger.Compat: FamInst :: CoAxiom Unbranched -> FamFlavor -> Name -> [RoughMatchTc] -> [TyVar] -> [CoVar] -> [Type] -> Type -> FamInst
+ GHC.TypeLits.Presburger.Compat: FamInstMatch :: FamInst -> [Type] -> [Coercion] -> FamInstMatch
+ GHC.TypeLits.Presburger.Compat: HsModule :: EpAnn AnnsModule -> LayoutInfo -> Maybe (LocatedA ModuleName) -> Maybe (LocatedL [LIE GhcPs]) -> [LImportDecl GhcPs] -> [LHsDecl GhcPs] -> Maybe (LocatedP WarningTxt) -> Maybe LHsDocString -> HsModule
+ GHC.TypeLits.Presburger.Compat: HsParsedModule :: Located HsModule -> [FilePath] -> HsParsedModule
+ GHC.TypeLits.Presburger.Compat: ImportDecl :: XCImportDecl pass -> SourceText -> XRec pass ModuleName -> Maybe StringLiteral -> IsBootInterface -> Bool -> ImportDeclQualifiedStyle -> Bool -> Maybe (XRec pass ModuleName) -> Maybe (Bool, XRec pass [LIE pass]) -> ImportDecl pass
+ GHC.TypeLits.Presburger.Compat: InjectivityAccepted :: InjectivityCheckResult
+ GHC.TypeLits.Presburger.Compat: InjectivityUnified :: CoAxBranch -> CoAxBranch -> InjectivityCheckResult
+ GHC.TypeLits.Presburger.Compat: IsBoot :: IsBootInterface
+ GHC.TypeLits.Presburger.Compat: LiftedInfo :: RuntimeRepInfo
+ GHC.TypeLits.Presburger.Compat: NoExtField :: NoExtField
+ GHC.TypeLits.Presburger.Compat: NotBoot :: IsBootInterface
+ GHC.TypeLits.Presburger.Compat: NotQualified :: ImportDeclQualifiedStyle
+ GHC.TypeLits.Presburger.Compat: QualifiedPost :: ImportDeclQualifiedStyle
+ GHC.TypeLits.Presburger.Compat: QualifiedPre :: ImportDeclQualifiedStyle
+ GHC.TypeLits.Presburger.Compat: SynFamilyInst :: FamFlavor
+ GHC.TypeLits.Presburger.Compat: UnliftedInfo :: RuntimeRepInfo
+ GHC.TypeLits.Presburger.Compat: XImportDecl :: !XXImportDecl pass -> ImportDecl pass
+ GHC.TypeLits.Presburger.Compat: [driverPlugin] :: Plugin -> [CommandLineOption] -> HscEnv -> IO HscEnv
+ GHC.TypeLits.Presburger.Compat: [fi_axiom] :: FamInst -> CoAxiom Unbranched
+ GHC.TypeLits.Presburger.Compat: [fi_cvs] :: FamInst -> [CoVar]
+ GHC.TypeLits.Presburger.Compat: [fi_fam] :: FamInst -> Name
+ GHC.TypeLits.Presburger.Compat: [fi_flavor] :: FamInst -> FamFlavor
+ GHC.TypeLits.Presburger.Compat: [fi_rhs] :: FamInst -> Type
+ GHC.TypeLits.Presburger.Compat: [fi_tcs] :: FamInst -> [RoughMatchTc]
+ GHC.TypeLits.Presburger.Compat: [fi_tvs] :: FamInst -> [TyVar]
+ GHC.TypeLits.Presburger.Compat: [fi_tys] :: FamInst -> [Type]
+ GHC.TypeLits.Presburger.Compat: [fim_cos] :: FamInstMatch -> [Coercion]
+ GHC.TypeLits.Presburger.Compat: [fim_instance] :: FamInstMatch -> FamInst
+ GHC.TypeLits.Presburger.Compat: [fim_tys] :: FamInstMatch -> [Type]
+ GHC.TypeLits.Presburger.Compat: [ft_mult] :: Type -> Mult
+ GHC.TypeLits.Presburger.Compat: [hpm_module] :: HsParsedModule -> Located HsModule
+ GHC.TypeLits.Presburger.Compat: [hpm_src_files] :: HsParsedModule -> [FilePath]
+ GHC.TypeLits.Presburger.Compat: [hsmodAnn] :: HsModule -> EpAnn AnnsModule
+ GHC.TypeLits.Presburger.Compat: [hsmodDecls] :: HsModule -> [LHsDecl GhcPs]
+ GHC.TypeLits.Presburger.Compat: [hsmodDeprecMessage] :: HsModule -> Maybe (LocatedP WarningTxt)
+ GHC.TypeLits.Presburger.Compat: [hsmodExports] :: HsModule -> Maybe (LocatedL [LIE GhcPs])
+ GHC.TypeLits.Presburger.Compat: [hsmodHaddockModHeader] :: HsModule -> Maybe LHsDocString
+ GHC.TypeLits.Presburger.Compat: [hsmodImports] :: HsModule -> [LImportDecl GhcPs]
+ GHC.TypeLits.Presburger.Compat: [hsmodLayout] :: HsModule -> LayoutInfo
+ GHC.TypeLits.Presburger.Compat: [hsmodName] :: HsModule -> Maybe (LocatedA ModuleName)
+ GHC.TypeLits.Presburger.Compat: [ideclAs] :: ImportDecl pass -> Maybe (XRec pass ModuleName)
+ GHC.TypeLits.Presburger.Compat: [ideclExt] :: ImportDecl pass -> XCImportDecl pass
+ GHC.TypeLits.Presburger.Compat: [ideclHiding] :: ImportDecl pass -> Maybe (Bool, XRec pass [LIE pass])
+ GHC.TypeLits.Presburger.Compat: [ideclImplicit] :: ImportDecl pass -> Bool
+ GHC.TypeLits.Presburger.Compat: [ideclName] :: ImportDecl pass -> XRec pass ModuleName
+ GHC.TypeLits.Presburger.Compat: [ideclPkgQual] :: ImportDecl pass -> Maybe StringLiteral
+ GHC.TypeLits.Presburger.Compat: [ideclQualified] :: ImportDecl pass -> ImportDeclQualifiedStyle
+ GHC.TypeLits.Presburger.Compat: [ideclSafe] :: ImportDecl pass -> Bool
+ GHC.TypeLits.Presburger.Compat: [ideclSourceSrc] :: ImportDecl pass -> SourceText
+ GHC.TypeLits.Presburger.Compat: [ideclSource] :: ImportDecl pass -> IsBootInterface
+ GHC.TypeLits.Presburger.Compat: [unPackageName] :: PackageName -> FastString
+ GHC.TypeLits.Presburger.Compat: apartnessCheck :: [Type] -> CoAxBranch -> Bool
+ GHC.TypeLits.Presburger.Compat: classInstances :: InstEnvs -> Class -> [ClsInst]
+ GHC.TypeLits.Presburger.Compat: consDataCon :: DataCon
+ GHC.TypeLits.Presburger.Compat: data FamFlavor
+ GHC.TypeLits.Presburger.Compat: data FamInst
+ GHC.TypeLits.Presburger.Compat: data FamInstMatch
+ GHC.TypeLits.Presburger.Compat: data HsModule
+ GHC.TypeLits.Presburger.Compat: data HsParsedModule
+ GHC.TypeLits.Presburger.Compat: data Hsc a
+ GHC.TypeLits.Presburger.Compat: data ImportDecl pass
+ GHC.TypeLits.Presburger.Compat: data ImportDeclQualifiedStyle
+ GHC.TypeLits.Presburger.Compat: data InjectivityCheckResult
+ GHC.TypeLits.Presburger.Compat: data IsBootInterface
+ GHC.TypeLits.Presburger.Compat: data NoExtField
+ GHC.TypeLits.Presburger.Compat: dataFamInstRepTyCon :: FamInst -> TyCon
+ GHC.TypeLits.Presburger.Compat: emptyFamInstEnv :: FamInstEnv
+ GHC.TypeLits.Presburger.Compat: emptyFamInstEnvs :: (FamInstEnv, FamInstEnv)
+ GHC.TypeLits.Presburger.Compat: extendFamInstEnv :: FamInstEnv -> FamInst -> FamInstEnv
+ GHC.TypeLits.Presburger.Compat: extendFamInstEnvList :: FamInstEnv -> [FamInst] -> FamInstEnv
+ GHC.TypeLits.Presburger.Compat: famInstAxiom :: FamInst -> CoAxiom Unbranched
+ GHC.TypeLits.Presburger.Compat: famInstEnvElts :: FamInstEnv -> [FamInst]
+ GHC.TypeLits.Presburger.Compat: famInstEnvSize :: FamInstEnv -> Int
+ GHC.TypeLits.Presburger.Compat: famInstRHS :: FamInst -> Type
+ GHC.TypeLits.Presburger.Compat: famInstRepTyCon_maybe :: FamInst -> Maybe TyCon
+ GHC.TypeLits.Presburger.Compat: famInstTyCon :: FamInst -> TyCon
+ GHC.TypeLits.Presburger.Compat: famInstsRepTyCons :: [FamInst] -> [TyCon]
+ GHC.TypeLits.Presburger.Compat: familyInstances :: (FamInstEnv, FamInstEnv) -> TyCon -> [FamInst]
+ GHC.TypeLits.Presburger.Compat: getInstEnvs :: TcPluginM InstEnvs
+ GHC.TypeLits.Presburger.Compat: injectiveBranches :: [Bool] -> CoAxBranch -> CoAxBranch -> InjectivityCheckResult
+ GHC.TypeLits.Presburger.Compat: instance GHC.Utils.Outputable.Outputable GHC.TypeLits.Presburger.Compat.TvSubst
+ GHC.TypeLits.Presburger.Compat: isConstraintKindCon :: TyCon -> Bool
+ GHC.TypeLits.Presburger.Compat: isDominatedBy :: CoAxBranch -> [CoAxBranch] -> Bool
+ GHC.TypeLits.Presburger.Compat: isForgetfulSynTyCon :: TyCon -> Bool
+ GHC.TypeLits.Presburger.Compat: isLiftedAlgTyCon :: TyCon -> Bool
+ GHC.TypeLits.Presburger.Compat: isNumLitTy :: Type -> Maybe Integer
+ GHC.TypeLits.Presburger.Compat: isStrLitTy :: Type -> Maybe FastString
+ GHC.TypeLits.Presburger.Compat: lookupAssertTyCon :: TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: lookupBool47 :: String -> TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: lookupFamInstEnv :: FamInstEnvs -> TyCon -> [Type] -> [FamInstMatch]
+ GHC.TypeLits.Presburger.Compat: lookupFamInstEnvByTyCon :: FamInstEnvs -> TyCon -> [FamInst]
+ GHC.TypeLits.Presburger.Compat: lookupFamInstEnvConflicts :: FamInstEnvs -> FamInst -> [FamInstMatch]
+ GHC.TypeLits.Presburger.Compat: lookupFamInstEnvInjectivityConflicts :: [Bool] -> FamInstEnvs -> FamInst -> [CoAxBranch]
+ GHC.TypeLits.Presburger.Compat: lookupTyAnd :: TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: lookupTyIf :: TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: lookupTyNot :: TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: lookupTyOr :: TcPluginM (Maybe TyCon)
+ GHC.TypeLits.Presburger.Compat: matchFam' :: TyCon -> [Type] -> TcPluginM (Maybe Type)
+ GHC.TypeLits.Presburger.Compat: mkBranchedCoAxiom :: Name -> TyCon -> [CoAxBranch] -> CoAxiom Branched
+ GHC.TypeLits.Presburger.Compat: mkCoAxBranch :: [TyVar] -> [TyVar] -> [CoVar] -> [Type] -> Type -> [Role] -> SrcSpan -> CoAxBranch
+ GHC.TypeLits.Presburger.Compat: mkImportedFamInst :: Name -> [RoughMatchTc] -> CoAxiom Unbranched -> FamInst
+ GHC.TypeLits.Presburger.Compat: mkNewTypeCoAxiom :: Name -> TyCon -> [TyVar] -> [Role] -> Type -> CoAxiom Unbranched
+ GHC.TypeLits.Presburger.Compat: mkSingleCoAxiom :: Role -> Name -> [TyVar] -> [TyVar] -> [CoVar] -> TyCon -> [Type] -> Type -> CoAxiom Unbranched
+ GHC.TypeLits.Presburger.Compat: mkUnbranchedCoAxiom :: Name -> TyCon -> CoAxBranch -> CoAxiom Unbranched
+ GHC.TypeLits.Presburger.Compat: nilDataCon :: DataCon
+ GHC.TypeLits.Presburger.Compat: normaliseTcApp :: FamInstEnvs -> Role -> TyCon -> [Type] -> (Coercion, Type)
+ GHC.TypeLits.Presburger.Compat: normaliseType :: FamInstEnvs -> Role -> Type -> (Coercion, Type)
+ GHC.TypeLits.Presburger.Compat: pprFamInst :: FamInst -> SDoc
+ GHC.TypeLits.Presburger.Compat: pprFamInsts :: [FamInst] -> SDoc
+ GHC.TypeLits.Presburger.Compat: reduceTyFamApp_maybe :: FamInstEnvs -> Role -> TyCon -> [Type] -> Maybe (Coercion, Type)
+ GHC.TypeLits.Presburger.Compat: topNormaliseType :: FamInstEnvs -> Type -> Type
+ GHC.TypeLits.Presburger.Compat: topNormaliseType_maybe :: FamInstEnvs -> Type -> Maybe (Coercion, Type)
+ GHC.TypeLits.Presburger.Compat: topReduceTyFamApp_maybe :: FamInstEnvs -> TyCon -> [Type] -> Maybe (Coercion, Type, MCoercion)
+ GHC.TypeLits.Presburger.Compat: tyConAlgDataCons_maybe :: TyCon -> Maybe [DataCon]
+ GHC.TypeLits.Presburger.Compat: tyConInvisTVBinders :: [TyConBinder] -> [InvisTVBinder]
+ GHC.TypeLits.Presburger.Compat: type FamInstEnv = UniqDFM TyCon FamilyInstEnv
+ GHC.TypeLits.Presburger.Compat: type FamInstEnvs = (FamInstEnv, FamInstEnv)
+ GHC.TypeLits.Presburger.Compat: type GhcPs = GhcPass 'Parsed
+ GHC.TypeLits.Presburger.Compat: type TcPluginSolveResult = TcPluginResult
+ GHC.TypeLits.Presburger.Compat: typeCharCmpTyCon :: TyCon
+ GHC.TypeLits.Presburger.Compat: typeCharToNatTyCon :: TyCon
+ GHC.TypeLits.Presburger.Compat: typeConsSymbolTyCon :: TyCon
+ GHC.TypeLits.Presburger.Compat: typeNatToCharTyCon :: TyCon
+ GHC.TypeLits.Presburger.Compat: typeUnconsSymbolTyCon :: TyCon
+ GHC.TypeLits.Presburger.Types: [assertTy] :: Translation -> [TyCon]
+ GHC.TypeLits.Presburger.Types: [tyAnd] :: Translation -> [TyCon]
+ GHC.TypeLits.Presburger.Types: [tyIf] :: Translation -> [TyCon]
+ GHC.TypeLits.Presburger.Types: [tyNot] :: Translation -> [TyCon]
+ GHC.TypeLits.Presburger.Types: [tyOr] :: Translation -> [TyCon]
- GHC.TypeLits.Presburger.Compat: ForAllPred :: [TyCoVarBinder] -> [PredType] -> PredType -> Pred
+ GHC.TypeLits.Presburger.Compat: ForAllPred :: [TyVar] -> [PredType] -> PredType -> Pred
- GHC.TypeLits.Presburger.Compat: FunTy :: AnonArgFlag -> Type -> Type -> Type
+ GHC.TypeLits.Presburger.Compat: FunTy :: AnonArgFlag -> Mult -> Type -> Type -> Type
- GHC.TypeLits.Presburger.Compat: Plugin :: CorePlugin -> TcPlugin -> HoleFitPlugin -> ([CommandLineOption] -> DynFlags -> IO DynFlags) -> ([CommandLineOption] -> IO PluginRecompile) -> ([CommandLineOption] -> ModSummary -> HsParsedModule -> Hsc HsParsedModule) -> ([CommandLineOption] -> TcGblEnv -> HsGroup GhcRn -> TcM (TcGblEnv, HsGroup GhcRn)) -> ([CommandLineOption] -> ModSummary -> TcGblEnv -> TcM TcGblEnv) -> ([CommandLineOption] -> LHsExpr GhcTc -> TcM (LHsExpr GhcTc)) -> (forall lcl. () => [CommandLineOption] -> ModIface -> IfM lcl ModIface) -> Plugin
+ GHC.TypeLits.Presburger.Compat: Plugin :: CorePlugin -> TcPlugin -> HoleFitPlugin -> ([CommandLineOption] -> HscEnv -> IO HscEnv) -> ([CommandLineOption] -> IO PluginRecompile) -> ([CommandLineOption] -> ModSummary -> HsParsedModule -> Hsc HsParsedModule) -> ([CommandLineOption] -> TcGblEnv -> HsGroup GhcRn -> TcM (TcGblEnv, HsGroup GhcRn)) -> ([CommandLineOption] -> ModSummary -> TcGblEnv -> TcM TcGblEnv) -> ([CommandLineOption] -> LHsExpr GhcTc -> TcM (LHsExpr GhcTc)) -> (forall lcl. () => [CommandLineOption] -> ModIface -> IfM lcl ModIface) -> Plugin
- GHC.TypeLits.Presburger.Compat: lookupPackageName :: DynFlags -> PackageName -> Maybe ComponentId
+ GHC.TypeLits.Presburger.Compat: lookupPackageName :: UnitState -> PackageName -> Maybe IndefUnitId
- GHC.TypeLits.Presburger.Compat: mkModule :: UnitId -> ModuleName -> Module
+ GHC.TypeLits.Presburger.Compat: mkModule :: u -> ModuleName -> GenModule u
- GHC.TypeLits.Presburger.Compat: mkSynonymTyCon :: Name -> [TyConBinder] -> Kind -> [Role] -> Type -> Bool -> Bool -> TyCon
+ GHC.TypeLits.Presburger.Compat: mkSynonymTyCon :: Name -> [TyConBinder] -> Kind -> [Role] -> Type -> Bool -> Bool -> Bool -> TyCon
- GHC.TypeLits.Presburger.Compat: primRepCompatible :: DynFlags -> PrimRep -> PrimRep -> Bool
+ GHC.TypeLits.Presburger.Compat: primRepCompatible :: Platform -> PrimRep -> PrimRep -> Bool
- GHC.TypeLits.Presburger.Compat: primRepSizeB :: DynFlags -> PrimRep -> Int
+ GHC.TypeLits.Presburger.Compat: primRepSizeB :: Platform -> PrimRep -> Int
- GHC.TypeLits.Presburger.Compat: primRepsCompatible :: DynFlags -> [PrimRep] -> [PrimRep] -> Bool
+ GHC.TypeLits.Presburger.Compat: primRepsCompatible :: Platform -> [PrimRep] -> [PrimRep] -> Bool
- GHC.TypeLits.Presburger.Compat: type HsModule' = HsModule GhcPs
+ GHC.TypeLits.Presburger.Compat: type HsModule' = HsModule
- GHC.TypeLits.Presburger.Compat: type ModuleUnit = UnitId
+ GHC.TypeLits.Presburger.Compat: type ModuleUnit = Unit
- GHC.TypeLits.Presburger.Compat: typeNatCoAxiomRules :: Map FastString CoAxiomRule
+ GHC.TypeLits.Presburger.Compat: typeNatCoAxiomRules :: UniqFM FastString CoAxiomRule
- GHC.TypeLits.Presburger.Compat: typeNatKind :: Kind
+ GHC.TypeLits.Presburger.Compat: typeNatKind :: TcType
- GHC.TypeLits.Presburger.Types: Translation :: [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> ((Type -> Machine Expr) -> Type -> Machine Prop) -> ((Type -> Machine Expr) -> Type -> Machine Expr) -> Translation
+ GHC.TypeLits.Presburger.Types: Translation :: [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> [TyCon] -> ((Type -> Machine Expr) -> Type -> Machine Prop) -> ((Type -> Machine Expr) -> Type -> Machine Expr) -> Translation
- GHC.TypeLits.Presburger.Types: infix 4 :>
+ GHC.TypeLits.Presburger.Types: infix 4 :<
Files
- examples/simple-arith-core.hs +24/−0
- ghc-typelits-presburger.cabal +29/−29
- src/GHC/TypeLits/Presburger/Compat.hs +64/−3
- src/GHC/TypeLits/Presburger/Types.hs +56/−9
- test/GHC/TypeLits/PresburgerSpec.hs +12/−1
examples/simple-arith-core.hs view
@@ -27,7 +27,11 @@ #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 902 import qualified Data.Type.Ord as DTO #endif+#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 904+import Data.Type.Bool+#endif + main :: IO () main = putStrLn "finished" @@ -131,4 +135,24 @@ maxLeq :: n <= m => NProxy n -> NProxy m -> DTO.Max n m :~: m maxLeq _ _ = Refl+#endif++#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 904+leqGeqToEq :: NProxy n -> NProxy m -> IsTrue (n <=? m && m <=? n) -> n :~: m+leqGeqToEq _ _ Witness = Refl++leqTotal :: NProxy n -> NProxy m -> IsTrue (n <=? m || m <=? n)+leqTotal _ _ = Witness++zeroMinimal :: NProxy n -> (n DTO.<? 0) :~: 'False+zeroMinimal _ = Refl++zeroMinimal' :: NProxy n -> IsTrue (Not (n DTO.<? 0))+zeroMinimal' _ = Witness++caseZero :: NProxy n -> IsTrue (If (n DTO.<=? 0) (n == 0) (n DTO.>? 0))+caseZero _ = Witness++succGtZero :: NProxy n -> IsTrue (0 DTO.<? If (n == 0) (n + 1) n)+succGtZero _ = Witness #endif
ghc-typelits-presburger.cabal view
@@ -1,37 +1,37 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.35.0. -- -- see: https://github.com/sol/hpack ----- hash: 321c5fb49fa1a616b17e9d7403d059fae66cceb781b4b2a12f547a6be9636e5d+-- hash: 5bdb1784549b51d4ed7b1ae34a734767d318511c03ce6a179548a7d14f66498a -name: ghc-typelits-presburger-version: 0.6.2.0-synopsis: Presburger Arithmetic Solver for GHC Type-level natural numbers.-description: @ghc-typelits-presburger@ augments GHC type-system with Presburger- Arithmetic Solver for Type-level natural numbers.- This plugin only work with GHC builtin operations.- To work with those of @singletons@ package, use @ghc-typelits-meta@ and/or @ghc-typelits-presburger@ instead.- .- Since 0.3.0.0, integration with <https://hackage.haskell.org/package/singletons singletons> package moves to <https://hackage.haskell.org/package/singletons-presburger singletons-presburger>.- .- You can use by adding this package to @build-depends@ and add the following pragma- to the head of .hs files:- .- .- > OPTIONS_GHC -fplugin GHC.TypeLits.Presburger-category: Math, Type System-homepage: https://github.com/konn/ghc-typelits-presburger#readme-bug-reports: https://github.com/konn/ghc-typelits-presburger/issues-author: Hiromi ISHII-maintainer: konn.jinro _at_ gmail.com-copyright: 2015 (c) Hiromi ISHII-license: BSD3-license-file: LICENSE+name: ghc-typelits-presburger+version: 0.7.0.0+synopsis: Presburger Arithmetic Solver for GHC Type-level natural numbers.+description: @ghc-typelits-presburger@ augments GHC type-system with Presburger+ Arithmetic Solver for Type-level natural numbers.+ This plugin only work with GHC builtin operations.+ To work with those of @singletons@ package, use @ghc-typelits-meta@ and/or @ghc-typelits-presburger@ instead.+ .+ Since 0.3.0.0, integration with <https://hackage.haskell.org/package/singletons singletons> package moves to <https://hackage.haskell.org/package/singletons-presburger singletons-presburger>.+ .+ You can use by adding this package to @build-depends@ and add the following pragma+ to the head of .hs files:+ .+ .+ > OPTIONS_GHC -fplugin GHC.TypeLits.Presburger+category: Math, Type System+homepage: https://github.com/konn/ghc-typelits-presburger#readme+bug-reports: https://github.com/konn/ghc-typelits-presburger/issues+author: Hiromi ISHII+maintainer: konn.jinro _at_ gmail.com+copyright: 2015 (c) Hiromi ISHII+license: BSD3+license-file: LICENSE tested-with:- GHC==8.6.5 GHC==8.8.4 GHC==8.10.7 GHC==9.0.1 GHC==9.2.1-build-type: Simple+ GHC==8.6.5 GHC==8.8.4 GHC==8.10.7 GHC==9.0.2 GHC==9.2.4 GHC==9.4.3+build-type: Simple source-repository head type: git@@ -56,7 +56,7 @@ build-depends: base >=4.7 && <5 , containers- , ghc <9.3+ , ghc <9.5 , ghc-tcplugins-extra >=0.2 && <0.5 , mtl , pretty@@ -76,9 +76,9 @@ base , equational-reasoning , ghc-typelits-presburger+ default-language: Haskell2010 if !(flag(examples)) buildable: False- default-language: Haskell2010 test-suite test-typeltis-presburger type: exitcode-stdio-1.0
src/GHC/TypeLits/Presburger/Compat.hs view
@@ -10,8 +10,19 @@ import Data.Generics.Twins #if MIN_VERSION_ghc(9,0,0)-import GHC.Builtin.Names as GHC.TypeLits.Presburger.Compat (gHC_TYPENATS, dATA_TYPE_EQUALITY)+import GHC.Builtin.Names as GHC.TypeLits.Presburger.Compat (gHC_TYPENATS)+#if MIN_VERSION_ghc(9,4,1)+import GHC.Tc.Types as GHC.TypeLits.Presburger.Compat (TcPlugin (..), TcPluginSolveResult (..))+#else+import GHC.Tc.Types as GHC.TypeLits.Presburger.Compat (TcPlugin (..), TcPluginResult (..))+#endif+#if MIN_VERSION_ghc(9,4,1)+import GHC.Builtin.Names as GHC.TypeLits.Presburger.Compat (mkBaseModule, gHC_TYPEERROR)+import GHC.Core.Reduction (reductionReducedType)+#else+import GHC.Builtin.Names as GHC.TypeLits.Presburger.Compat (dATA_TYPE_EQUALITY) import qualified GHC.Builtin.Names as Old+#endif import GHC.Hs as GHC.TypeLits.Presburger.Compat (HsModule(..), NoExtField(..)) import GHC.Hs.ImpExp as GHC.TypeLits.Presburger.Compat (ImportDecl(..), ImportDeclQualifiedStyle(..)) import GHC.Hs.Extension as GHC.TypeLits.Presburger.Compat (GhcPs)@@ -104,7 +115,7 @@ tcPluginIO, tcPluginTrace, )-import GHC.Tc.Types as GHC.TypeLits.Presburger.Compat (TcPlugin (..), TcPluginResult (..))+import GHC.Tc.Types as GHC.TypeLits.Presburger.Compat (TcPlugin (..)) import GHC.Tc.Types.Constraint as GHC.TypeLits.Presburger.Compat ( Ct, CtEvidence,@@ -209,6 +220,15 @@ #endif #endif +#if !MIN_VERSION_ghc(9,4,1)+type TcPluginSolveResult = TcPluginResult+#endif++#if MIN_VERSION_ghc(9,4,1)+dATA_TYPE_EQUALITY :: Module+dATA_TYPE_EQUALITY = mkBaseModule "Data.Type.Equality"+#endif+ #if MIN_VERSION_ghc(8,10,1) type PredTree = Pred #endif@@ -368,10 +388,19 @@ type RawUnitId = FastString preloadedUnitsM :: TcPluginM [FastString] -#if MIN_VERSION_ghc(9,2,0)+#if MIN_VERSION_ghc(9,4,0) preloadedUnitsM = do logger <- unsafeTcPluginTcM getLogger dflags <- hsc_dflags <$> getTopEnv+ packs <- tcPluginIO $ initUnits logger dflags Nothing mempty <&> + \(_, us, _, _ ) -> preloadUnits us+ let packNames = map (\(UnitId p) -> p) packs+ tcPluginTrace "pres: packs" $ ppr packNames+ pure packNames+#elif MIN_VERSION_ghc(9,2,0)+preloadedUnitsM = do+ logger <- unsafeTcPluginTcM getLogger+ dflags <- hsc_dflags <$> getTopEnv packs <- tcPluginIO $ initUnits logger dflags Nothing <&> \(_, us, _, _ ) -> preloadUnits us let packNames = map (\(UnitId p) -> p) packs@@ -464,6 +493,15 @@ pure typeNatLeqTyCon #endif +lookupAssertTyCon :: TcPluginM (Maybe TyCon)+#if MIN_VERSION_base(4,17,0)+lookupAssertTyCon = + fmap Just . tcLookupTyCon =<< lookupOrig gHC_TYPEERROR (mkTcOcc "Assert")+#else+lookupAssertTyCon = pure Nothing+#endif++ lookupTyNatPredLt :: TcPluginM (Maybe TyCon) -- Note: base library shipepd with 9.2.1 has a wrong implementation; -- hence we MUST NOT desugar it with <= 9.2.1@@ -536,4 +574,27 @@ tcLookupTyCon =<< lookupOrig tyOrd (mkTcOcc "Compare") #else lookupTyGenericCompare = pure Nothing+#endif+++lookupBool47 :: String -> TcPluginM (Maybe TyCon)+#if MIN_VERSION_base(4,17,0)+lookupBool47 nam = Just <$> do+ tcLookupTyCon =<< lookupOrig (mkBaseModule "Data.Type.Bool") (mkTcOcc nam)+#else+lookupBool47 = const $ pure Nothing+#endif++lookupTyNot, lookupTyIf, lookupTyAnd, lookupTyOr :: TcPluginM (Maybe TyCon)+lookupTyNot = lookupBool47 "Not"+lookupTyIf = lookupBool47 "If"+lookupTyAnd = lookupBool47 "&&"+lookupTyOr = lookupBool47 "||"+++matchFam' :: TyCon -> [Type] -> TcPluginM (Maybe Type)+#if MIN_VERSION_ghc(9,4,1)+matchFam' con args = fmap reductionReducedType <$> matchFam con args+#else+matchFam' con args = fmap snd <$> matchFam con args #endif
src/GHC/TypeLits/Presburger/Types.hs view
@@ -15,6 +15,7 @@ {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DerivingVia #-}+{-# LANGUAGE NamedFieldPuns #-} -- | Since 0.3.0.0 module GHC.TypeLits.Presburger.Types ( pluginWith,@@ -114,8 +115,16 @@ "typelits-presburger" TcPlugin { tcPluginInit = return ()- , tcPluginSolve = decidePresburger mode trans , tcPluginStop = const $ return ()+#if MIN_VERSION_ghc(9,4,1)+ , tcPluginSolve = const $ \_ gs ws -> decidePresburger mode trans () gs [] ws+#else+ , tcPluginSolve = decidePresburger mode trans+#endif++#if MIN_VERSION_ghc(9,4,1)+ , tcPluginRewrite = mempty+#endif } testIf :: PropSet -> Prop -> Proof@@ -167,6 +176,7 @@ data Translation = Translation { isEmpty :: [TyCon] , ordCond :: [TyCon]+ , assertTy :: [TyCon] , isTrue :: [TyCon] , trueData :: [TyCon] , falseData :: [TyCon]@@ -174,6 +184,10 @@ , tyEq :: [TyCon] , tyEqBool :: [TyCon] , tyEqWitness :: [TyCon]+ , tyNot :: [TyCon]+ , tyAnd :: [TyCon]+ , tyOr :: [TyCon]+ , tyIf :: [TyCon] , tyNeqBool :: [TyCon] , natPlus :: [TyCon] , natMinus :: [TyCon]@@ -202,8 +216,13 @@ Translation { isEmpty = isEmpty l <> isEmpty r , isTrue = isTrue l <> isTrue r+ , assertTy = assertTy l <> assertTy r , voids = voids l <> voids r , tyEq = tyEq l <> tyEq r+ , tyNot = tyNot l <> tyNot r+ , tyAnd = tyAnd l <> tyAnd r+ , tyOr = tyOr l <> tyOr r+ , tyIf = tyIf l <> tyIf r , tyEqBool = tyEqBool l <> tyEqBool r , tyEqWitness = tyEqWitness l <> tyEqWitness r , tyNeqBool = tyNeqBool l <> tyNeqBool r@@ -237,10 +256,15 @@ Translation { isEmpty = mempty , isTrue = mempty+ , assertTy = mempty , tyEq = mempty , tyEqBool = mempty , tyEqWitness = mempty , tyNeqBool = mempty+ , tyNot = mempty+ , tyAnd = mempty+ , tyOr = mempty+ , tyIf = mempty , voids = mempty , natPlus = mempty , natMinus = mempty@@ -267,7 +291,7 @@ , ordCond = mempty } -decidePresburger :: PluginMode -> TcPluginM Translation -> () -> [Ct] -> [Ct] -> [Ct] -> TcPluginM TcPluginResult+decidePresburger :: PluginMode -> TcPluginM Translation -> () -> [Ct] -> [Ct] -> [Ct] -> TcPluginM TcPluginSolveResult decidePresburger _ genTrans _ gs [] [] = do tcPluginTrace "pres: Started givens with: " (ppr $ map (ctEvPred . ctEvidence) gs) trans <- genTrans@@ -287,7 +311,6 @@ tcPluginTrace "pres: Current subst" (ppr subst) tcPluginTrace "pres: wanteds" $ ppr $ map (subsType subst . deconsPred . subsCt subst) ws tcPluginTrace "pres: givens" $ ppr $ map (subsType subst . deconsPred) gs- tcPluginTrace "pres: deriveds" $ ppr $ map deconsPred _ds (prems, wants, prems0) <- do wants <- catMaybes@@ -355,6 +378,7 @@ eqTyCon_ <- getEqTyCon eqBoolTyCon <- tcLookupTyCon =<< lookupOrig dATA_TYPE_EQUALITY (mkTcOcc "==") eqWitCon_ <- getEqWitnessTyCon+ assertTy <- lookupAssertTyCon vmd <- lookupModule (mkModuleName "Data.Void") (fsLit "base") voidTyCon <- tcLookupTyCon =<< lookupOrig vmd (mkTcOcc "Void") nLeq <- tcLookupTyCon =<< lookupTyNatPredLeq@@ -367,10 +391,19 @@ mTyGtB <- lookupTyNatBoolGt mOrdCond <- mOrdCondTyCon mtyGenericCompare <- lookupTyGenericCompare+ tyNot <- maybeToList <$> lookupTyNot+ tyAnd <- maybeToList <$> lookupTyAnd+ tyOr <- maybeToList <$> lookupTyOr+ tyIf <- maybeToList <$> lookupTyIf let trans = mempty { isEmpty = isEmpties+ , assertTy = maybeToList assertTy , tyEq = [eqTyCon_]+ , tyNot+ , tyAnd+ , tyOr+ , tyIf , ordCond = F.toList mOrdCond , tyEqWitness = [eqWitCon_] , tyEqBool = [eqBoolTyCon]@@ -401,12 +434,6 @@ (<=>) :: Prop -> Prop -> Prop p <=> q = (p :&& q) :|| (Not p :&& Not q) -withEv :: Ct -> (EvTerm, Ct)-withEv ct =- case classifyPredType (deconsPred ct) of- EqPred _ t1 t2 -> (evByFiat "ghc-typelits-presburger" t1 t2, ct)- _ -> error $ "UnknownPredEv: " <> showSDocUnsafe (ppr ct)- orderingDic :: Given Translation => [(TyCon, Expr -> Expr -> Prop)] orderingDic = [(lt, (:<)) | lt <- orderingLT given]@@ -420,6 +447,8 @@ toPresburgerPred (TyConApp con (lastN 2 -> [t1, t2])) | con `elem` (natLeq given ++ natLeqBool given) = (:<=) <$> toPresburgerExp t1 <*> toPresburgerExp t2+toPresburgerPred (TyConApp con [t1, _])+ | con `elem` assertTy given = toPresburgerPred t1 toPresburgerPred ty | Just (con, []) <- splitTyConApp_maybe ty , con `elem` trueData given =@@ -442,6 +471,21 @@ | Just (con, [l]) <- splitTyConApp_maybe ty -- IsTrue l => , con `elem` isTrue given = toPresburgerPred l+ | Just (con, [l]) <- splitTyConApp_maybe ty -- Not p (from Data.Type.Bool)+ , con `elem` tyNot given =+ Not <$> toPresburgerPred l+ | Just (con, [l, r]) <- splitTyConApp_maybe ty -- p && q (from Data.Type.Bool)+ , con `elem` tyAnd given =+ (:&&) <$> toPresburgerPred l <*> toPresburgerPred r+ | Just (con, [l, r]) <- splitTyConApp_maybe ty -- p || q (from Data.Type.Bool)+ , con `elem` tyOr given =+ (:||) <$> toPresburgerPred l <*> toPresburgerPred r+ | Just (con, lastN 3 -> [p, t, f]) <- splitTyConApp_maybe ty -- If p t f (from Data.Type.Bool)+ , con `elem` tyIf given = do+ p' <- toPresburgerPred p+ (:||) + <$> ((p' :&&) <$> toPresburgerPred t) + <*> ((Not p':&&) <$> toPresburgerPred f) | Just (con, [t1, t2]) <- splitTyConAppLastBin ty , typeKind t1 `eqType` typeNatKind , typeKind t2 `eqType` typeNatKind @@ -601,6 +645,9 @@ toPresburgerExp :: Given Translation => Type -> Machine Expr toPresburgerExp ty = case ty of TyVarTy t -> return $ Var $ toName $ getKey $ getUnique t+ TyConApp tc (lastN 3 -> [p, t, f])+ | tc `elem` tyIf given ->+ If <$> toPresburgerPred p <*> toPresburgerExp t <*> toPresburgerExp f TyConApp tc (lastN 4 -> [cmpNM, l, e, g]) | tc `elem` ordCond given , TyConApp cmp (lastN 2 -> [n, m]) <- cmpNM
test/GHC/TypeLits/PresburgerSpec.hs view
@@ -21,6 +21,9 @@ case eith of Left (TypeError msg) | "Could not deduce: (n GHC.TypeNats.+ 1) ~ n"+ `T.isInfixOf` T.pack msg + || + "Could not deduce ((n GHC.TypeNats.+ 1) ~ n)" `T.isInfixOf` T.pack msg -> pure () _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith@@ -29,6 +32,8 @@ case eith of Left (TypeError msg) | "Could not deduce: (n GHC.TypeNats.+ 1) ~ n"+ `T.isInfixOf` T.pack msg + || "Could not deduce ((n GHC.TypeNats.+ 1) ~ n)" `T.isInfixOf` T.pack msg -> pure () _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith@@ -43,7 +48,10 @@ case eith of Left (TypeError msg) | "Could not deduce: n1 ~ n"- `T.isInfixOf` T.pack msg ->+ `T.isInfixOf` T.pack msg + || "Could not deduce (n1 ~ n)"+ `T.isInfixOf` T.pack msg + -> pure () _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith , testCase "With plugin" $ do@@ -51,6 +59,9 @@ case eith of Left (TypeError msg) | "Could not deduce: n1 ~ n"+ `T.isInfixOf` T.pack msg + || + "Could not deduce (n1 ~ n)" `T.isInfixOf` T.pack msg -> pure () _ -> assertFailure $ "TypeError with mismatch expected, but got: " <> show eith