Guest User

Untitled

a guest
Jan 21st, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. module SemVer(
  2. makeVersion,
  3. incrementMajor,
  4. incrementMinor,
  5. incrementPatch,
  6. IncludingNegativeVersion,
  7. ) where
  8.  
  9. import Text.Printf
  10. import Data.Typeable
  11. import Control.Exception
  12. import Data.List
  13.  
  14. newtype VersionNumber = VersionNumber Integer deriving Eq
  15. instance Show VersionNumber where
  16. show (VersionNumber a) = show a
  17.  
  18. increment (VersionNumber a) = VersionNumber $ a + 1
  19. zero = VersionNumber 0
  20.  
  21. data Version = Version {
  22. major :: VersionNumber,
  23. minor :: VersionNumber,
  24. patch :: VersionNumber
  25. } deriving(Eq)
  26.  
  27. instance Show Version where
  28. show (Version ma mi p) = intercalate "." $ show <$> [ma, mi, p]
  29.  
  30. data IncludingNegativeVersion = IncludingNegativeVersion deriving Typeable
  31. instance Show IncludingNegativeVersion where
  32. show IncludingNegativeVersion = "バージョン番号に負の数が含まれています。"
  33. instance Exception IncludingNegativeVersion
  34.  
  35. makeVersion :: Integer -> Integer -> Integer -> Version
  36. makeVersion major minor patch = if allNonNegative then result else throw IncludingNegativeVersion
  37. where
  38. allNonNegative = major >= 0 && minor >= 0 && patch >= 0
  39. result = Version {
  40. major = VersionNumber major,
  41. minor = VersionNumber minor,
  42. patch = VersionNumber patch
  43. }
  44.  
  45. incrementPatch :: Version -> Version
  46. incrementPatch v = Version {
  47. major = major v,
  48. minor = minor v,
  49. patch = increment $ patch v
  50. }
  51.  
  52. incrementMinor :: Version -> Version
  53. incrementMinor v = Version {
  54. major = major v,
  55. minor = increment $ minor v,
  56. patch = zero
  57. }
  58.  
  59. incrementMajor :: Version -> Version
  60. incrementMajor v = Version {
  61. major = increment $ major v,
  62. minor = zero,
  63. patch = zero
  64. }
Add Comment
Please, Sign In to add comment