@@ -145,9 +145,9 @@ instance Json.ToJSON Name where
146data Version =
146data Version =
148− { _major :: Int
148+ { _major :: {-# UNPACK #-} !Word16
149− , _minor :: Int
149+ , _minor :: {-# UNPACK #-} !Word16
150− , _patch :: Int
150+ , _patch :: {-# UNPACK #-} !Word16
152 deriving (Eq, Ord)
152 deriving (Eq, Ord)
@@ -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)
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
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))
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 )
@@ -209,34 +211,47 @@ versionToText (Version major minor patch) =
210versionFromText :: Text -> Either String Version
212versionFromText :: Text -> Either String Version
211versionFromText text =
213versionFromText text =
214− Text.splitOn "." text
214+ case Text.splitOn "." text of
215+ [major, minor, patch] ->
216− toNumber txt =
221+ _ ->
217− case Text.decimal txt of
222+ Left "Must have format MAJOR.MINOR.PATCH (e.g. 1.0.2)"
224− case traverse toNumber chunks of
225− Just [major, minor, patch] ->
226− Right (Version major minor patch)
225+toNumber :: Text -> Either String Word16
227+ case Text.decimal txt of
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)"
232instance Binary Version where
235instance Binary Version where
234− Version <$> get <*> get <*> get
239+ then Version <$> get <*> get <*> get
241+ do minor <- fromIntegral <$> getWord8
242+ patch <- fromIntegral <$> getWord8
243+ return (Version (fromIntegral word) minor patch)
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)
237− do put major
252+ put major
238− put minor
253+ put minor
239− put patch
254+ put patch
242instance Json.FromJSON Version where
257instance Json.FromJSON Version where