diff --git a/.gitattributes b/.gitattributes
index ed1e6ce..8079d31 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8,4 +8,5 @@ phpstan-tests.neon export-ignore
phpstan.neon export-ignore
phpunit.xml.dist export-ignore
resources/ export-ignore
+static-analysis/ export-ignore
tests/ export-ignore
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index 817b034..2baddc9 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -12,6 +12,7 @@
./src
+ ./static-analysis
./tests
diff --git a/psalm.xml b/psalm.xml
new file mode 100644
index 0000000..7abdda9
--- /dev/null
+++ b/psalm.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/static-analysis/UuidIsImmutable.php b/static-analysis/UuidIsImmutable.php
new file mode 100644
index 0000000..0cedc3b
--- /dev/null
+++ b/static-analysis/UuidIsImmutable.php
@@ -0,0 +1,91 @@
+
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\StaticAnalysis;
+
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * This is a static analysis fixture to verify that the API signature
+ * of a UUID allows for pure operations. Almost all methods will seem to be
+ * redundant or trivial: that's normal, we're just verifying the
+ * transitivity of immutable type signatures.
+ *
+ * Please note that this does not guarantee that the internals of the UUID
+ * library are pure/safe, but just that the declared API to the outside world
+ * is seen as immutable.
+ */
+final class UuidIsImmutable
+{
+ /** @psalm-pure */
+ public static function pureCompareTo(UuidInterface $a, UuidInterface $b): int
+ {
+ return $a->compareTo($b);
+ }
+
+ /** @psalm-pure */
+ public static function pureEquals(UuidInterface $a, ?object $b): bool
+ {
+ return $a->equals($b);
+ }
+
+ /**
+ * @return mixed[]
+ *
+ * @psalm-pure
+ */
+ public static function pureGetters(UuidInterface $a): array
+ {
+ return [
+ $a->getBytes(),
+ $a->getNumberConverter(),
+ $a->getHex(),
+ $a->getFieldsHex(),
+ $a->getClockSeqHiAndReservedHex(),
+ $a->getClockSeqLowHex(),
+ $a->getClockSequenceHex(),
+ $a->getDateTime(),
+ $a->getInteger(),
+ $a->getLeastSignificantBitsHex(),
+ $a->getMostSignificantBitsHex(),
+ $a->getNodeHex(),
+ $a->getTimeHiAndVersionHex(),
+ $a->getTimeLowHex(),
+ $a->getTimeMidHex(),
+ $a->getTimestampHex(),
+ $a->getUrn(),
+ $a->getVariant(),
+ $a->getVersion(),
+ $a->toString(),
+ $a->__toString(),
+ ];
+ }
+
+ /**
+ * @return UuidInterface[]|bool[]
+ *
+ * @psalm-pure
+ */
+ public static function pureStaticUuidApi(): array
+ {
+ $id = Uuid::fromString('ff6f8cb0-c57d-11e1-9b21-0800200c9a66');
+
+ return [
+ Uuid::fromBytes($id->getBytes()),
+ Uuid::fromInteger($id->getInteger()),
+ Uuid::isValid('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'),
+ ];
+ }
+}