@@ -43,10 +43,8 @@ module Language.PureScript.TypeChecker.Types (
44import Data.List
44import Data.List
45import Data.Maybe (maybeToList, isNothing, isJust, fromMaybe)
45import Data.Maybe (maybeToList, isNothing, isJust, fromMaybe)
46−import qualified Data.Data as D
47import Data.Generics
46import Data.Generics
48− (everythingWithContext, mkM, everywhereM,
49− everything, mkT, something, everywhere, mkQ)
47+ (everythingWithContext, mkM, mkT, something, everywhere, mkQ)
50import Data.Generics.Extras
48import Data.Generics.Extras
52import Language.PureScript.Declarations
50import Language.PureScript.Declarations
@@ -373,7 +371,7 @@ entails env moduleName context = solve (sortedNubBy canonicalizeDictionary (filt
373 return $ map head grps
371 return $ map head grps
374 -- Apply a substitution to a type
372 -- Apply a substitution to a type
375 applySubst :: [(String, Type)] -> Type -> Maybe Type
373 applySubst :: [(String, Type)] -> Type -> Maybe Type
376− applySubst subst = everywhereM (mkM replace)
374+ applySubst subst = everywhereOnTypesM replace
378 replace (TypeVar v) = lookup v subst
376 replace (TypeVar v) = lookup v subst
379 replace other = Just other
377 replace other = Just other
@@ -463,7 +461,7 @@ skolemEscapeCheck root@TypedValue{} =
463 _ -> ([], scos)
461 _ -> ([], scos)
465 collectSkolems :: Type -> [SkolemScope]
463 collectSkolems :: Type -> [SkolemScope]
466− collectSkolems = nub . everything (++) (mkQ [] collect)
464+ collectSkolems = nub . everythingOnTypes (++) collect
468 collect (Skolem _ _ scope) = [scope]
466 collect (Skolem _ _ scope) = [scope]
469 collect _ = []
467 collect _ = []
@@ -484,8 +482,8 @@ setify = rowFromList . first (M.toList . M.fromList) . rowToList
485-- \"Setify\" all rows occuring inside a value
483-- \"Setify\" all rows occuring inside a value
487−setifyAll :: (D.Data d) => d -> d
485+setifyAll :: Type -> Type
488−setifyAll = everywhere (mkT setify)
486+setifyAll = everywhereOnTypes setify
491-- Replace outermost unsolved unification variables with named type variables
489-- Replace outermost unsolved unification variables with named type variables
@@ -494,7 +492,7 @@ varIfUnknown :: Type -> Type
494varIfUnknown ty =
492varIfUnknown ty =
495 let unks = nub $ unknowns ty
493 let unks = nub $ unknowns ty
496 toName = (:) 't' . show
494 toName = (:) 't' . show
497− ty' = everywhere (mkT typeToVar) ty
495+ ty' = everywhereOnTypes typeToVar ty
498 typeToVar :: Type -> Type
496 typeToVar :: Type -> Type
499 typeToVar (TUnknown (Unknown u)) = TypeVar (toName u)
497 typeToVar (TUnknown (Unknown u)) = TypeVar (toName u)
500 typeToVar t = t
498 typeToVar t = t
@@ -529,14 +527,14 @@ replaceVarWithUnknown ident ty = do
529-- Replace fully applied type synonyms with the @SaturatedTypeSynonym@ data constructor, which helps generate
527-- Replace fully applied type synonyms with the @SaturatedTypeSynonym@ data constructor, which helps generate
530-- better error messages during unification.
528-- better error messages during unification.
532−replaceAllTypeSynonyms' :: (D.Data d) => Environment -> d -> Either String d
530+replaceAllTypeSynonyms' :: Environment -> Type -> Either String Type
533replaceAllTypeSynonyms' env d =
531replaceAllTypeSynonyms' env d =
535 syns = map (\(name, (args, _)) -> (name, length args)) . M.toList $ typeSynonyms env
533 syns = map (\(name, (args, _)) -> (name, length args)) . M.toList $ typeSynonyms env
537 saturateAllTypeSynonyms syns d
535 saturateAllTypeSynonyms syns d
539−replaceAllTypeSynonyms :: (Error e, Functor m, Monad m, MonadState CheckState m, MonadError e m) => (D.Data d) => d -> m d
537+replaceAllTypeSynonyms :: (Error e, Functor m, Monad m, MonadState CheckState m, MonadError e m) => Type -> m Type
540replaceAllTypeSynonyms d = do
538replaceAllTypeSynonyms d = do
541 env <- getEnv
539 env <- getEnv
542 either (throwError . strMsg) return $ replaceAllTypeSynonyms' env d
540 either (throwError . strMsg) return $ replaceAllTypeSynonyms' env d
@@ -544,8 +542,8 @@ replaceAllTypeSynonyms d = do
545-- \"Desaturate\" @SaturatedTypeSynonym@s
543-- \"Desaturate\" @SaturatedTypeSynonym@s
547−desaturateAllTypeSynonyms :: (D.Data d) => d -> d
545+desaturateAllTypeSynonyms :: Type -> Type
548−desaturateAllTypeSynonyms = everywhere (mkT replaceSaturatedTypeSynonym)
546+desaturateAllTypeSynonyms = everywhereOnTypes replaceSaturatedTypeSynonym
550 replaceSaturatedTypeSynonym (SaturatedTypeSynonym name args) = foldl TypeApp (TypeConstructor name) args
548 replaceSaturatedTypeSynonym (SaturatedTypeSynonym name args) = foldl TypeApp (TypeConstructor name) args
551 replaceSaturatedTypeSynonym t = t
549 replaceSaturatedTypeSynonym t = t
@@ -566,8 +564,8 @@ expandTypeSynonym name args = do
566 env <- getEnv
564 env <- getEnv
567 either (throwError . strMsg) return $ expandTypeSynonym' env name args
565 either (throwError . strMsg) return $ expandTypeSynonym' env name args
569−expandAllTypeSynonyms :: (Error e, Functor m, Monad m, MonadState CheckState m, MonadError e m) => Type -> m Type
567+expandAllTypeSynonyms :: (Error e, Functor m, Applicative m, Monad m, MonadState CheckState m, MonadError e m) => Type -> m Type
570−expandAllTypeSynonyms = everywhereM' (mkM go)
568+expandAllTypeSynonyms = everywhereOnTypesTopDownM go
572 go (SaturatedTypeSynonym name args) = expandTypeSynonym name args
570 go (SaturatedTypeSynonym name args) = expandTypeSynonym name args
573 go other = return other
571 go other = return other
@@ -822,7 +820,7 @@ skolemizeTypesInValue ident sko scope = everywhere (mkT go)
822-- Introduce skolem scope at every occurence of a ForAll
820-- Introduce skolem scope at every occurence of a ForAll
824introduceSkolemScope :: Type -> UnifyT Type Check Type
822introduceSkolemScope :: Type -> UnifyT Type Check Type
825−introduceSkolemScope = everywhereM (mkM go)
823+introduceSkolemScope = everywhereOnTypesM go
827 go (ForAll ident ty Nothing) = ForAll ident ty <$> (Just <$> newSkolemScope)
825 go (ForAll ident ty Nothing) = ForAll ident ty <$> (Just <$> newSkolemScope)
828 go other = return other
826 go other = return other
@@ -964,7 +962,7 @@ check' (PositionedValue pos val) ty =
964check' val ty = throwError $ mkErrorStack ("Value does not have type " ++ prettyPrintType ty) (Just (ValueError val))
962check' val ty = throwError $ mkErrorStack ("Value does not have type " ++ prettyPrintType ty) (Just (ValueError val))
966containsTypeSynonyms :: Type -> Bool
964containsTypeSynonyms :: Type -> Bool
967−containsTypeSynonyms = everything (||) (mkQ False go) where
965+containsTypeSynonyms = everythingOnTypes (||) go where
968 go (SaturatedTypeSynonym _ _) = True
966 go (SaturatedTypeSynonym _ _) = True
969 go _ = False
967 go _ = False