diff options
| author | bringert <unknown> | 2004-12-06 16:02:08 +0000 |
|---|---|---|
| committer | bringert <unknown> | 2004-12-06 16:02:08 +0000 |
| commit | 798cb370029712dc96e9ca5d1fbacc698c6d3649 (patch) | |
| tree | 4db09c94a9c6046439d0e1c6ce4971add0b86013 /src/GF/Data/SharedString.hs | |
| parent | b63729307209c8f1c942cb70af12f89a46372993 (diff) | |
Use HashTable to share strings in tokens when parsing GFC files.
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 |
