2 | module Libraries.Data.Version
6 | import Libraries.Text.Parser
7 | import Libraries.Text.Lexer
13 | record Version where
14 | constructor MkVersion
17 | semVer : (Nat, Nat, Nat)
20 | versionTag : Maybe String
24 | showVersion : Bool -> Version -> String
25 | showVersion tag (MkVersion (maj,min,patch) versionTag) =
26 | concat (intersperse "." (map show [ maj, min, patch])) ++
27 | if tag then showTag else ""
30 | showTag = case versionTag of
32 | Just tag => "-" ++ tag
36 | show = showVersion True
40 | (==) (MkVersion ver tag) (MkVersion ver' tag') = ver == ver' && tag == tag'
44 | compare (MkVersion ver tag) (MkVersion ver' tag') =
45 | case compare ver ver' of
46 | EQ => compare tag tag'
53 | data VersionTokenKind = VersionText | VersionNum | VersionDot | VersionDash
55 | Eq VersionTokenKind where
56 | (==) VersionText VersionText = True
57 | (==) VersionNum VersionNum = True
58 | (==) VersionDot VersionDot = True
59 | (==) VersionDash VersionDash = True
64 | VersionToken = Token VersionTokenKind
66 | TokenKind VersionTokenKind where
67 | TokType VersionText = String
68 | TokType VersionDot = ()
69 | TokType VersionDash = ()
70 | TokType VersionNum = Nat
72 | tokValue VersionText x = x
73 | tokValue VersionDot _ = ()
74 | tokValue VersionDash _ = ()
75 | tokValue VersionNum n = stringToNatOrZ n
77 | versionTokenMap : TokenMap VersionToken
78 | versionTokenMap = toTokenMap $
79 | [ (is '.', VersionDot)
80 | , (is '-', VersionDash)
81 | , (digits, VersionNum)
82 | , (some alphaNum, VersionText)
85 | lexVersion : String -> List (WithBounds VersionToken)
88 | (tokens, _, _, _) = lex versionTokenMap str
93 | versionParser : Grammar () VersionToken True Version
95 | maj <- match VersionNum
97 | min <- match VersionNum
99 | patch <- match VersionNum
100 | optTag <- optional $
match VersionDash *> match VersionText
101 | pure $
MkVersion (maj, min, patch) optTag
112 | parseVersion : String -> Maybe Version
114 | case parse versionParser (lexVersion str) of
115 | Right (_, version, []) => Just version