on master help sign in
Create a newtype for Marks so ranks and marks never get mixed up
commit34a253d27a7f2b581cee9bf985322593aaaacdbe authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 17 Jul 2017, 10:47 (9 years ago) parent3e23ef2
3 files changed+31−18
src/Type/Solve.hs+3−3 src/Type/State.hs+5−5 src/Type/Type.hs+23−10
src/Type/Solve.hs+3−3
@@ -64,7 +64,7 @@ generalize pool@(TS.Pool youngRank _) =
6464 liftIO $ UF.setDescriptor var $ Descriptor (rigidify content) noRank mark copy
6565
6666
67−poolToRankTable :: Int -> TS.Pool -> IO (Vector.Vector [Variable])
67+poolToRankTable :: Mark -> TS.Pool -> IO (Vector.Vector [Variable])
6868poolToRankTable youngMark (TS.Pool youngRank youngInhabitants) =
6969 do mutableTable <- MVector.replicate (youngRank + 1) []
7070
@@ -94,7 +94,7 @@ rigidify content =
9494-- Adjust variable ranks such that ranks never increase as you move deeper.
9595-- This way the outermost rank is representative of the entire structure.
9696--
97−adjustRank :: Int -> Int -> Int -> Variable -> IO Int
97+adjustRank :: Mark -> Mark -> Int -> Variable -> IO Int
9898adjustRank youngMark visitedMark groupRank var =
9999 {-# SCC elm_compiler_type_adjust #-}
100100 do (Descriptor content rank mark copy) <- UF.descriptor var
@@ -115,7 +115,7 @@ adjustRank youngMark visitedMark groupRank var =
115115 return minRank
116116
117117
118−adjustRankContent :: Int -> Int -> Int -> Content -> IO Int
118+adjustRankContent :: Mark -> Mark -> Int -> Content -> IO Int
119119adjustRankContent youngMark visitedMark groupRank content =
120120 let
121121 go = adjustRank youngMark visitedMark groupRank
src/Type/State.hs+5−5
@@ -30,7 +30,7 @@ import Data.Text (Text)
3030import qualified Reporting.Annotation as A
3131import qualified Reporting.Error.Type as Error
3232import qualified Reporting.Region as R
33−import Type.Type
33+import Type.Type as Type
3434import qualified Type.UnionFind as UF
3535
3636
@@ -58,7 +58,7 @@ initialState =
5858 { sEnv = Map.empty
5959 , sSavedEnv = Map.empty
6060 , sPool = Pool outermostRank []
61− , sMark = noMark + 1 -- The mark must never be equal to noMark!
61+ , sMark = Type.nextMark noMark -- The mark must never be equal to noMark!
6262 , sError = []
6363 }
6464
@@ -72,7 +72,7 @@ data State =
7272 { sEnv :: Env
7373 , sSavedEnv :: Env
7474 , sPool :: Pool
75− , sMark :: Int
75+ , sMark :: Mark
7676 , sError :: [A.Located Error.Error]
7777 }
7878
@@ -151,10 +151,10 @@ saveLocalEnv =
151151
152152
153153{-# INLINE uniqueMark #-}
154−uniqueMark :: Solver Int
154+uniqueMark :: Solver Mark
155155uniqueMark =
156156 Solver $ \(SS env savedEnv pool mark errors) ->
157− return ( mark, SS env savedEnv pool (mark + 1) errors )
157+ return ( mark, SS env savedEnv pool (Type.nextMark mark) errors )
158158
159159
160160{-# INLINE nextRankPool #-}
src/Type/Type.hs+23−10
@@ -10,8 +10,9 @@ module Type.Type
1010 , Super(..)
1111 , noRank
1212 , outermostRank
13+ , Mark
1314 , noMark
14− , initialMark
15+ , nextMark
1516 , (==>), float, char, string, bool
1617 , mkFlexVar
1718 , mkFlexNumber
@@ -28,6 +29,7 @@ import qualified Data.Map as Map
2829import Data.Monoid ((<>))
2930import qualified Data.Text as Text
3031import Data.Text (Text)
32+import Data.Word (Word32)
3133
3234import qualified AST.Type as T
3335import qualified AST.Variable as Var
@@ -67,7 +69,7 @@ data Descriptor =
6769 Descriptor
6870 { _content :: Content
6971 , _rank :: Int
70− , _mark :: Int
72+ , _mark :: Mark
7173 , _copy :: Maybe Variable
7274 }
7375
@@ -105,22 +107,33 @@ outermostRank :: Int
105107outermostRank = 1
106108
107109
108−noMark :: Int
109−noMark = 2
110110
111+-- MARKS
111112
112−initialMark :: Int
113−initialMark = 3
114113
114+newtype Mark = Mark Word32
115+ deriving (Eq, Ord)
115116
116−occursMark :: Int
117+
118+noMark :: Mark
119+noMark =
120+ Mark 2
121+
122+
123+occursMark :: Mark
117124occursMark =
118− 1
125+ Mark 1
119126
120127
121−getVarNamesMark :: Int
128+getVarNamesMark :: Mark
122129getVarNamesMark =
123− 0
130+ Mark 0
131+
132+
133+{-# INLINE nextMark #-}
134+nextMark :: Mark -> Mark
135+nextMark (Mark mark) =
136+ Mark (mark + 1)
124137
125138
126139