diff options
Diffstat (limited to 'compiler/GHC/HsToCore/PmCheck/Types.hs')
-rw-r--r-- | compiler/GHC/HsToCore/PmCheck/Types.hs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/compiler/GHC/HsToCore/PmCheck/Types.hs b/compiler/GHC/HsToCore/PmCheck/Types.hs index 26e6ffc67e..e263a1640b 100644 --- a/compiler/GHC/HsToCore/PmCheck/Types.hs +++ b/compiler/GHC/HsToCore/PmCheck/Types.hs @@ -29,7 +29,8 @@ module GHC.HsToCore.PmCheck.Types ( setIndirectSDIE, setEntrySDIE, traverseSDIE, -- * The pattern match oracle - VarInfo(..), TmState(..), TyState(..), Delta(..), initDelta + VarInfo(..), TmState(..), TyState(..), Delta(..), + Deltas(..), initDeltas, liftDeltasM ) where #include "HsVersions.h" @@ -64,6 +65,7 @@ import Numeric (fromRat) import Data.Foldable (find) import qualified Data.List.NonEmpty as NonEmpty import Data.Ratio +import qualified Data.Semigroup as Semi -- | Literals (simple and overloaded ones) for pattern match checking. -- @@ -520,8 +522,7 @@ instance Outputable TyState where initTyState :: TyState initTyState = TySt emptyBag --- | Term and type constraints to accompany each value vector abstraction. --- For efficiency, we store the term oracle state instead of the term +-- | An inert set of canonical (i.e. mutually compatible) term and type -- constraints. data Delta = MkDelta { delta_ty_st :: TyState -- Type oracle; things like a~Int , delta_tm_st :: TmState } -- Term oracle; things like x~Nothing @@ -537,3 +538,18 @@ instance Outputable Delta where ppr (delta_tm_st delta), ppr (delta_ty_st delta) ] + +-- | A disjunctive bag of 'Delta's, representing a refinement type. +newtype Deltas = MkDeltas (Bag Delta) + +initDeltas :: Deltas +initDeltas = MkDeltas (unitBag initDelta) + +instance Outputable Deltas where + ppr (MkDeltas deltas) = ppr deltas + +instance Semigroup Deltas where + MkDeltas l <> MkDeltas r = MkDeltas (l `unionBags` r) + +liftDeltasM :: Monad m => (Delta -> m (Maybe Delta)) -> Deltas -> m Deltas +liftDeltasM f (MkDeltas ds) = MkDeltas . catBagMaybes <$> (traverse f ds) |