values [ +lt+ = ] all?
] unit-test
+{ "1.2.4-dev.0" } [ "1.2.3" <semver> semver-inc-prepatch semver>string ] unit-test
+{ "1.2.4" } [ "1.2.3" <semver> semver-inc-patch semver>string ] unit-test
+
+{ "1.3.0-dev.0" } [ "1.2.3" <semver> semver-inc-preminor semver>string ] unit-test
+{ "1.3.0" } [ "1.2.3" <semver> semver-inc-minor semver>string ] unit-test
+
+{ "2.0.0-dev.0" } [ "1.2.3" <semver> semver-inc-premajor semver>string ] unit-test
+{ "2.0.0-dev.1" } [ "1.2.3" <semver> semver-inc-premajor semver-inc-prerelease semver>string ] unit-test
+{ "2.0.0" } [ "1.2.3" <semver> semver-inc-major semver>string ] unit-test
+
+{ "1.2.3-erg.0" } [ "1.2.3" <semver> "erg" semver-inc-prerelease-id semver>string ] unit-test
! Copyright (C) 2020 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs combinators combinators.smart
+USING: accessors arrays assocs combinators combinators.smart io
kernel math math.order math.parser multiline peg.ebnf sequences
sequences.deep sequences.extras splitting strings ;
IN: semver
[ "." split [ string>number ] map first3 ] 2dip
semver boa ;
+: <semver> ( str -- semver ) parse-semver ; inline
+
: first-semver-slot ( semver -- class )
{
{ [ dup major>> 0 > ] [ drop major ] }
} cleave
] "" append-outputs-as ;
+: semver. ( semver -- )
+ semver>string print ;
+
: semver-inc-major ( semver -- semver )
dup prerelease>> [
[ 1 + ] change-major
: semver-inc-patch ( semver -- semver )
dup prerelease>> [
[ 1 + ] change-patch
- 0 >>patch
"" >>prerelease
"" >>build
] [