mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
add GF.Source.SharedString
This commit is contained in:
20
src-3.0/GF/Source/SharedString.hs
Normal file
20
src-3.0/GF/Source/SharedString.hs
Normal file
@@ -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'
|
||||
Reference in New Issue
Block a user