-- ---------------------------------------------------------------------------- {- | 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 -- ------------------------------------------------------------