content: {-# LANGUAGE Safe #-}
  
  -- |
  --
  -- Module      :  System.Mem.StableName
  -- Copyright   :  (c) The University of Glasgow 2001
  -- License     :  BSD-style (see the file libraries/base/LICENSE)
  --
  -- Maintainer  :  libraries@haskell.org
  -- Stability   :  stable
  -- Portability :  non-portable
  --
  -- Stable names are a way of performing fast ( \(\mathcal{O}(1)\) ),
  -- not-quite-exact comparison between objects.
  --
  -- Stable names solve the following problem: suppose you want to build
  -- a hash table with Haskell objects as keys, but you want to use
  -- pointer equality for comparison; maybe because the keys are large
  -- and hashing would be slow, or perhaps because the keys are infinite
  -- in size.  We can\'t build a hash table using the address of the
  -- object as the key, because objects get moved around by the garbage
  -- collector, meaning a re-hash would be necessary after every garbage
  -- collection.
  --
  -- See [Stretching the storage manager: weak pointers and stable names in
  -- Haskell](https://www.microsoft.com/en-us/research/publication/stretching-the-storage-manager-weak-pointers-and-stable-names-in-haskell/)
  -- by Simon Peyton Jones, Simon Marlow and Conal Elliott for detailed discussion
  -- of stable names. An implementation of a memo table with stable names
  -- can be found in [@stable-memo@](https://hackage.haskell.org/package/stable-memo)
  -- package.
  --
  
  module System.Mem.StableName
      (-- *  Stable Names
       StableName,
       makeStableName,
       hashStableName,
       eqStableName
       ) where
  
  import GHC.Internal.System.Mem.StableName