content: -- ----------------------------------------------------------------------------
  {- |
  A cache for single element 'IntSet's with elements 0 <= i < cacheSize (1024)
  These single element sets occur very frequently in position sets
  in occurrence maps, so sharing becomes available with this cache.
  
  Usage: substitute all singleton calls with @cacheAt@ calls
  and all @fromList@ calls with @IS.unions . map cacheAt@.
  -}
  -- ----------------------------------------------------------------------------
  
  module Data.IntSet.Cache
    ( cache
    , cacheAt
    )
  where
  import           Control.DeepSeq
  
  import qualified Data.IntSet     as S
  import qualified Data.Vector     as V
  
  -- ------------------------------------------------------------
  
  -- | Size of the cache.
  cacheSize :: Int
  cacheSize = 1024
  
  -- | Initialize the 'IntSet' cache.
  cache :: V.Vector S.IntSet
  cache = id $!! V.generate cacheSize S.singleton
  
  -- | A (cached) 'IntSet' singleton.
  cacheAt :: Int -> S.IntSet
  cacheAt i
      | 0 <= i
        &&
        i < cacheSize
            = id $! cache V.! i
      | otherwise
          = id $! S.singleton i
  
  -- ------------------------------------------------------------
  