@hackage symbolize1.0.0.0

Efficient global Symbol table, with Garbage Collection.

Symbols, also known as Atoms or Interned Strings, are a common technique to reduce memory usage and improve performance when using many small strings.

By storing a single copy of each encountered string in a global table and giving out pointers to the stored keys, it is possible to compare strings for equality in constant time, instead of linear (in string size) time. Furthermore, by using StableName, hashing of Symbols also takes constant-time, so Symbols make great hashmap keys!.

The main advantages of Symbolize over other symbol table implementations are:

  • Garbage collection: Symbols which are no longer used are automatically cleaned up.

  • Support for any Textual type, including String, (strict and lazy) Data.Text, (strict and lazy) Data.ByteString, ShortText, ShortByteString, etc.

  • Great memory usage:

  • Symbols are simply a (lifted) wrapper around a ByteArray#, which is nicely unpacked by GHC.

  • The symbol table is an IntMap that contains weak pointers to these same ByteArray#s and their associated StableName#s

  • Great performance:

  • unintern is a simple pointer-dereference

  • calls to lookup are free of atomic memory barriers (and never have to wait on a concurrent thread running intern)

  • Thread-safe

Please see the full README below or on GitHub at https://github.com/Qqwy/haskell-symbolize#readme