1
1
mirror of https://github.com/github/semantic.git synced 2024-11-24 08:54:07 +03:00

Use a type synonym for types.

This commit is contained in:
Rob Rix 2019-07-29 12:23:07 -04:00
parent 6652520175
commit 97ae6e9b21
No known key found for this signature in database
GPG Key ID: F188A01508EA1CF7

View File

@ -46,6 +46,8 @@ data Monotype f a
| Record (Map.Map User (f a))
deriving (Foldable, Functor, Generic1, Traversable)
type Type = Term Monotype Meta
-- FIXME: Union the effects/annotations on the operands.
deriving via (Last (Term Monotype a)) instance Semigroup (Term Monotype a)
@ -89,7 +91,7 @@ generalize ty = fromJust (closed (forAlls (IntSet.toList (mvs ty)) (hoistTerm R
typecheckingFlowInsensitive
:: [File (Term (Core.Ann :+: Core.Core) User)]
-> ( Heap User (Term Monotype Meta)
-> ( Heap User Type
, [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))]
)
typecheckingFlowInsensitive
@ -103,17 +105,17 @@ runFile
:: ( Carrier sig m
, Effect sig
, Member Fresh sig
, Member (State (Heap User (Term Monotype Meta))) sig
, Member (State (Heap User Type)) sig
, Ord (term User)
)
=> (forall sig m . (Carrier sig m, Member (Reader Loc) sig, MonadFail m) => Analysis term User (Term Monotype Meta) m -> (term User -> m (Term Monotype Meta)) -> (term User -> m (Term Monotype Meta)))
=> (forall sig m . (Carrier sig m, Member (Reader Loc) sig, MonadFail m) => Analysis term User Type m -> (term User -> m Type) -> (term User -> m Type))
-> File (term User)
-> m (File (Either (Loc, String) (Term Monotype Meta)))
-> m (File (Either (Loc, String) Type))
runFile eval file = traverse run file
where run
= (\ m -> do
(subst, t) <- m
modify @(Heap User (Term Monotype Meta)) (fmap (Set.map (substAll subst)))
modify @(Heap User Type) (fmap (Set.map (substAll subst)))
pure (substAll subst <$> t))
. runState (mempty :: Substitution)
. runReader (fileLoc file)
@ -133,9 +135,9 @@ typecheckingAnalysis
, Carrier sig m
, Member Fresh sig
, Member (State (Set.Set Constraint)) sig
, Member (State (Heap User (Term Monotype Meta))) sig
, Member (State (Heap User Type)) sig
)
=> Analysis term User (Term Monotype Meta) m
=> Analysis term User Type m
typecheckingAnalysis = Analysis{..}
where alloc = pure
bind _ _ m = m
@ -175,7 +177,7 @@ data Solution
infix 5 :=
meta :: (Carrier sig m, Member Fresh sig) => m (Term Monotype Meta)
meta :: (Carrier sig m, Member Fresh sig) => m Type
meta = pure <$> Fresh.fresh
unify :: (Carrier sig m, Member (State (Set.Set Constraint)) sig) => Term Monotype Meta -> Term Monotype Meta -> m ()
@ -183,7 +185,7 @@ unify t1 t2
| t1 == t2 = pure ()
| otherwise = modify (<> Set.singleton (t1 :===: t2))
type Substitution = IntMap.IntMap (Term Monotype Meta)
type Substitution = IntMap.IntMap Type
solve :: (Carrier sig m, Member (State Substitution) sig, MonadFail m) => Set.Set Constraint -> m ()
solve cs = for_ cs solve