on master help sign in
Use more compact memory representation for Version
49ada59Evan Czaplicki
src/Elm/Compiler/Version.hs+4−4
@@ -6,14 +6,13 @@ import qualified Paths_elm_compiler as This
6import Elm.Package (Version(Version))
6import Elm.Package (Version(Version))
7
7
8
8
9−rawVersion :: [Int]
9+
10−rawVersion =
10+-- VERSION
11− Version.versionBranch This.version
12
11
13
12
14version :: Version
13version :: Version
15version =
14version =
16− case rawVersion of
15+ case map fromIntegral (Version.versionBranch This.version) of
17 major : minor : patch : _ ->
16 major : minor : patch : _ ->
18 Version major minor patch
17 Version major minor patch
19
18
@@ -25,3 +24,4 @@ version =
25
24
26 [] ->
25 [] ->
27 error "could not detect version of elm-compiler you are using"
26 error "could not detect version of elm-compiler you are using"
27+
src/Elm/Package.hs+39−24
@@ -145,9 +145,9 @@ instance Json.ToJSON Name where
145
145
146data Version =
146data Version =
147 Version
147 Version
148− { _major :: Int
148+ { _major :: {-# UNPACK #-} !Word16
149− , _minor :: Int
149+ , _minor :: {-# UNPACK #-} !Word16
150− , _patch :: Int
150+ , _patch :: {-# UNPACK #-} !Word16
151 }
151 }
152 deriving (Eq, Ord)
152 deriving (Eq, Ord)
153
153
@@ -165,10 +165,12 @@ bumpPatch :: Version -> Version
165bumpPatch (Version major minor patch) =
165bumpPatch (Version major minor patch) =
166 Version major minor (patch + 1)
166 Version major minor (patch + 1)
167
167
168+
168bumpMinor :: Version -> Version
169bumpMinor :: Version -> Version
169bumpMinor (Version major minor _patch) =
170bumpMinor (Version major minor _patch) =
170 Version major (minor + 1) 0
171 Version major (minor + 1) 0
171
172
173+
172bumpMajor :: Version -> Version
174bumpMajor :: Version -> Version
173bumpMajor (Version major _minor _patch) =
175bumpMajor (Version major _minor _patch) =
174 Version (major + 1) 0 0
176 Version (major + 1) 0 0
@@ -183,9 +185,9 @@ filterLatest characteristic versions =
183 map last (List.groupBy ((==) `on` characteristic) (List.sort versions))
185 map last (List.groupBy ((==) `on` characteristic) (List.sort versions))
184
186
185
187
186−majorAndMinor :: Version -> (Int,Int)
188+majorAndMinor :: Version -> ( Int, Int )
187majorAndMinor (Version major minor _patch) =
189majorAndMinor (Version major minor _patch) =
188− (major, minor)
190+ ( fromIntegral major, fromIntegral minor )
189
191
190
192
191
193
@@ -209,34 +211,47 @@ versionToText (Version major minor patch) =
209
211
210versionFromText :: Text -> Either String Version
212versionFromText :: Text -> Either String Version
211versionFromText text =
213versionFromText text =
212− let
213− chunks =
214− Text.splitOn "." text
214+ case Text.splitOn "." text of
215+ [major, minor, patch] ->
216+ Version
217+ <$> toNumber major
218+ <*> toNumber minor
219+ <*> toNumber patch
215
220
216− toNumber txt =
221+ _ ->
217− case Text.decimal txt of
222+ Left "Must have format MAJOR.MINOR.PATCH (e.g. 1.0.2)"
218− Right (n, "") ->
219− Just n
220
223
221− _ ->
222− Nothing
223− in
224− case traverse toNumber chunks of
225− Just [major, minor, patch] ->
226− Right (Version major minor patch)
227
224
225+toNumber :: Text -> Either String Word16
226+toNumber txt =
227+ case Text.decimal txt of
228+ Right (n, "") ->
229+ Right n
230+
228− _ ->
231+ _ ->
229− Left "Must have format MAJOR.MINOR.PATCH (e.g. 1.0.2)"
232+ Left "Must have format MAJOR.MINOR.PATCH (e.g. 1.0.2)"
230
233
231
234
232instance Binary Version where
235instance Binary Version where
233 get =
236 get =
237+ do word <- getWord8
238+ if word == 0
234− Version <$> get <*> get <*> get
239+ then Version <$> get <*> get <*> get
240+ else
241+ do minor <- fromIntegral <$> getWord8
242+ patch <- fromIntegral <$> getWord8
243+ return (Version (fromIntegral word) minor patch)
235
244
236 put (Version major minor patch) =
245 put (Version major minor patch) =
246+ if major < 256 && minor < 256 && patch < 256 then
247+ do putWord8 (fromIntegral major)
248+ putWord8 (fromIntegral minor)
249+ putWord8 (fromIntegral patch)
250+ else
251+ do putWord8 0
237− do put major
252+ put major
238− put minor
253+ put minor
239− put patch
254+ put patch
240
255
241
256
242instance Json.FromJSON Version where
257instance Json.FromJSON Version where