prim-uniq-0.1: Opaque unique identifiers in primitive state monads




data Uniq s Source

A Uniq is a value that can only be constructed under controlled conditions (in IO or ST, basically), and once constructed can only be compared to Uniq values created under the same conditions (in the same monad). Upon comparison, a Uniq is ONLY ever equal to itself. Beyond that, no promises regarding ordering are made except that once constructed the order is deterministic and a proper ordering relation (eg, > is transitive and irreflexive, etc.)


Eq (Uniq s) 
Ord (Uniq s) 
Show (Uniq RealWorld)

There is only one RealWorld, so this instance is sound (unlike the general unsafeShowsPrecUniq). Note that there is no particular relationship between Uniq values (or the strings show turns them into) created in different executions of a program. The value they render to should be considered completely arbitrary, and the Show instance only even exists for convenience when testing code that uses Uniqs.

getUniq :: PrimMonad m => m (Uniq (PrimState m))Source

Construct a new Uniq that is equal to itself, unequal to every other Uniq constructed in the same monad, and incomparable to every Uniq constructed in any other monad.

unsafeMkUniq :: Integer -> Uniq sSource

For the implementation of Uniq construction in new monads, this operation is exposed. Users must accept responsibility for ensuring true uniqueness across the lifetime of the resulting Uniq value. Failure to do so could lead to type unsoundness in code depending on uniqueness as a type witness (eg, Data.Unique.Tag).

unsafeShowsPrecUniq :: Int -> Uniq s -> ShowSSource

A Show instance for Uniq s would not be sound, but for debugging purposes we occasionally will want to do it anyway. Its unsoundness is nicely demonstrated by:

 runST (fmap show getUniq) :: String

Which, despite having type String, is not referentially transparent.