diff options
Diffstat (limited to 'src/GF/Data/SharedString.hs')
| -rw-r--r-- | src/GF/Data/SharedString.hs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/GF/Data/SharedString.hs b/src/GF/Data/SharedString.hs new file mode 100644 index 000000000..f03f6f469 --- /dev/null +++ b/src/GF/Data/SharedString.hs @@ -0,0 +1,18 @@ +module SharedString (shareString) where + +import Data.HashTable as H +import System.IO.Unsafe (unsafePerformIO) + +{-# NOINLINE stringPool #-} +stringPool :: HashTable String String +stringPool = unsafePerformIO $ new (==) hashString + +{-# NOINLINE shareString #-} +shareString :: String -> String +shareString s = unsafePerformIO $ do + mv <- H.lookup stringPool s + case mv of + Just s' -> return s' + Nothing -> do + H.insert stringPool s s + return s |
