text: prim-uniq
  Opaque unique identifiers in primitive state monads
  See all snapshots
  prim-uniq appears in
  prim-uniq-0.2@sha256:7bfd8a729812bf212610b63459b76a086ecd5ce48f48d785c288e082d055d47b,1403
  Module documentation for 0.2
  - Data
  - Data.Unique
  - Unsafe
  - Unsafe.Unique
  Unique values and an ad-hoc “unique-tag GADT”
  This library defines 2 types -
  Uniq and
  Tag.
  Uniq is a traditional “unique value” type, extended with a state-token type parameter so it works in both
  IO and
  ST.
  Tag is like
  Uniq with the addition of a phantom type parameter. The type of that parameter is fixed at the time the
  Tag is created, so the uniqueness of the tag means that equality of tag values witnesses equality of their phantom types. In other words, given two
  Tags, if they are equal then their phantom type parameters are the same - just like pattern matching on a GADT constructor. The
  GEq and
  GCompare classes from the
  dependent-sum package can be used to discover that type equality, allowing
  Tag to be used for a pretty cool semi-dynamic typing scheme. For example (using the
  dependent-map library):
  import Data.Unique.Tag import Data.Dependent.Map main = do x <- newTag y <- newTag z <- newTag let m1 = fromList [x :=> 3, y :=> "hello"] m2 = fromList [x :=> 17, z :=> (True, x)] -- the type checker would (rightly) reject this line: -- m3 = singleton y ("foo", "bar") print (m1 ! x) print (m1 ! y) print (m2 ! x) print (m1 ! snd (m2 ! z))
  Which would print:
  3 "hello" 17 3
  Changes
  Revision history for prim-uniq
  0.2 - 2020-04-11
  - Update for dependent-sum 0.7. (Support GHC 8.8.)
  dependent-sumdropped the
  (:=)type. Use
  (:~:)instead.
  - Fix a minor strictness issue (#1).