Operations

The core library provides composable operations for version manipulation.

Status Checks

import version.*

val v = "1.2.3-alpha.1".toVersionUnsafe

v.stable // true (major > 0 and not snapshot)
v.snapshot // false
v.preRelease.isDefined // true

// Check via PreRelease extensions
v.preRelease.get.isAlpha // true
v.preRelease.get.isSnapshot // false

Core Extraction

Strip pre-release and metadata:

val v = "1.2.3-alpha.1+build.456".toVersionUnsafe
v.core  // Version(1, 2, 3)

Bumping

Core Components

Use next[F] for type-safe bumping. Clears pre-release and metadata:

val v = "1.2.3".toVersionUnsafe

v.next[MajorVersion]  // 2.0.0 (resets minor and patch)
v.next[MinorVersion]  // 1.3.0 (resets patch)
v.next[PatchNumber]   // 1.2.4

// Useful in generic code
def bump[F](v: Version)(using Version.Increment[F]): Version = v.next[F]

Pre-release Classifiers

next[C] also supports versioned pre-release classifiers with precedence-aware semantics:

import version.PreReleaseClassifier.*

val final = "1.2.3".toVersionUnsafe
val alpha = "1.2.3-alpha.1".toVersionUnsafe
val beta = "1.2.3-beta.1".toVersionUnsafe
val snap = "1.2.3-SNAPSHOT".toVersionUnsafe

// Final version → start pre-release cycle
final.next[Alpha]  // 1.2.3-alpha.1

// Same classifier → increment number
alpha.next[Alpha]  // 1.2.3-alpha.2

// Higher-precedence classifier → advance within cycle
alpha.next[Beta]   // 1.2.3-beta.1
alpha.next[ReleaseCandidate] // 1.2.3-rc.1

// Lower-precedence classifier → new patch cycle
beta.next[Alpha]   // 1.2.4-alpha.1

// Snapshot (highest) → any versioned = new patch cycle
snap.next[Alpha]   // 1.2.4-alpha.1

Note: Snapshot has no Increment instance — use as[Snapshot] instead.

Pre-release Operations

Setting Classifier Directly

as[C] sets the pre-release classifier without precedence logic. Clears build metadata.

val v = "1.2.3".toVersionUnsafe

// With default number (1 for versioned classifiers)
v.as[Alpha] // 1.2.3-alpha.1
v.as[ReleaseCandidate] // 1.2.3-rc.1
v.as[Snapshot] // 1.2.3-SNAPSHOT

// With specific number
v.as[Alpha](5)
// Right(1.2.3-alpha.5)

// Error: snapshot cannot have a number
v.as[Snapshot](1)
// Left(ClassifierNotVersioned(Snapshot))

Removing Pre-release

Use core or copy to remove pre-release:

val v = "1.2.3-alpha.1".toVersionUnsafe
v.core // 1.2.3 (also removes metadata)
v.copy(preRelease = None) // 1.2.3 (preserves metadata)

Build Metadata

Use copy for metadata operations:

val v = "1.2.3".toVersionUnsafe

// Setting metadata
v.copy(metadata = Some(Metadata(List("build", "456"))))
// 1.2.3+build.456

// Removing metadata
val vMeta = "1.2.3+build.456".toVersionUnsafe
vMeta.copy(metadata = None) // 1.2.3

Rendering

Standard Show

Default excludes build metadata:

import version.*

val v = "1.2.3-alpha.1+build.456".toVersionUnsafe
v.show  // "1.2.3-alpha.1"

Extended Show

Include metadata (SHAs truncated to 7 chars):

import version.*
given Version.Show = Version.Show.Extended

val v = "1.2.3-SNAPSHOT+sha1234567890abcdef".toVersionUnsafe
v.show  // "1.2.3-SNAPSHOT+sha1234567"

Comparison

Versions implement Ordered[Version]:

val a = "1.0.0".toVersionUnsafe
val b = "2.0.0".toVersionUnsafe

a < b           // true
a.compare(b)    // -1
List(b, a).sorted  // List(a, b)