+{-|
+ An abstract name for an object, that supports equality and hashing.
+
+ Stable names have the following property:
+
+ * If @sn1 :: StableName@ and @sn2 :: StableName@ and @sn1 == sn2@
+ then @sn1@ and @sn2@ were created by calls to @makeStableName@ on
+ the same object.
+
+ The reverse is not necessarily true: if two stable names are not
+ equal, then the objects they name may still be equal. Note in particular
+ that `mkStableName` may return a different `StableName` after an
+ object is evaluated.
+
+ Stable Names are similar to Stable Pointers ("Foreign.StablePtr"),
+ but differ in the following ways:
+
+ * There is no @freeStableName@ operation, unlike "Foreign.StablePtr"s.
+ Stable names are reclaimed by the runtime system when they are no
+ longer needed.
+
+ * There is no @deRefStableName@ operation. You can\'t get back from
+ a stable name to the original Haskell object. The reason for
+ this is that the existence of a stable name for an object does not
+ guarantee the existence of the object itself; it can still be garbage
+ collected.
+-}
+