1 ! Copyright (C) 2010 Maximilian Lupke.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays ascii kernel math math.order math.parser sequences
4 sorting.human splitting ;
5 IN: semantic-versioning
9 : number<=> ( obj1 obj2 -- <=> )
10 [ [ zero? ] trim-tail-slice ] bi@ <=> ;
12 : pre-release<=> ( obj1 obj2 -- <=> )
13 2dup [ empty? ] either?
14 [ 2length >=< ] [ human<=> ] if ;
18 : split-version ( string -- array )
20 dup [ [ digit? not ] [ CHAR: . = not ] bi and ] find [
21 [ cut ] [ CHAR: - = [ rest [ f ] when-empty ] when ] bi*
23 [ "." split [ string>number 0 or ] map 3 0 pad-tail ] dip
26 : version<=> ( version1 version2 -- <=> )
28 2dup [ first ] bi@ number<=> dup +eq+ =
29 [ drop [ second ] bi@ pre-release<=> ] [ 2nip ] if ;
31 : version< ( version1 version2 -- ? )
34 : version<= ( version1 version2 -- ? )
35 version<=> { +lt+ +eq+ } member-eq? ;
37 : version= ( version1 version2 -- ? )
40 : version>= ( version1 version2 -- ? )
41 version<=> { +gt+ +eq+ } member-eq? ;
43 : version> ( version1 version2 -- ? )