From e9e80fc389365e24d4300d7d5390c7d833a96c50 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 25 Jun 2008 16:54:35 +0000 Subject: changed names of resource-1.3; added a note on homepage on release --- src/GF/Source/SharedString.hs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/GF/Source/SharedString.hs (limited to 'src/GF/Source/SharedString.hs') diff --git a/src/GF/Source/SharedString.hs b/src/GF/Source/SharedString.hs new file mode 100644 index 000000000..732873fe6 --- /dev/null +++ b/src/GF/Source/SharedString.hs @@ -0,0 +1,20 @@ +module GF.Source.SharedString (shareString) where + +import Data.Map as M +import Data.IORef +import qualified Data.ByteString.Char8 as BS +import System.IO.Unsafe (unsafePerformIO) + +{-# NOINLINE stringPoolRef #-} +stringPoolRef :: IORef (M.Map BS.ByteString BS.ByteString) +stringPoolRef = unsafePerformIO $ newIORef M.empty + +{-# NOINLINE shareString #-} +shareString :: BS.ByteString -> BS.ByteString +shareString s = unsafePerformIO $ do + stringPool <- readIORef stringPoolRef + case M.lookup s stringPool of + Just s' -> return s' + Nothing -> do let s' = BS.copy s + writeIORef stringPoolRef $! M.insert s' s' stringPool + return s' -- cgit v1.2.3