[clean up Atom code some, switch to IntMap for reverse lookup
John Meacham <john@repetae.net>**20061104042935] hunk ./Atom.hs 20
-import qualified Data.HashTable as HT
hunk ./Atom.hs 21
+import Data.IORef
+import qualified Data.HashTable as HT
+import qualified Data.IntMap as IM
hunk ./Atom.hs 38
-reverseTable :: HT.HashTable Int PackedString
-reverseTable = unsafePerformIO (HT.new (==) (fromIntegral))
+reverseTable :: IORef (IM.IntMap PackedString)
+reverseTable = unsafePerformIO (newIORef IM.empty)
hunk ./Atom.hs 56
-toPackedString atom = atomToPS atom
hunk ./Atom.hs 92
+{-# NOINLINE fromPackedStringIO #-}
hunk ./Atom.hs 101
-        HT.insert reverseTable i ps
+        modifyIORef reverseTable (IM.insert ((i - 1) `div` 2) ps)
hunk ./Atom.hs 112
+{-# NOINLINE intToAtom #-}
hunk ./Atom.hs 114
-intToAtom i = unsafePerformIO $  HT.lookup reverseTable i >>= \x -> case x of
-    Just _ -> return (return $ Atom i)
-    Nothing -> return $ fail $ "intToAtom: " ++ show i
+intToAtom i | odd i && i > 0 = unsafePerformIO $ readIORef (i `seq` reverseTable) >>= \x -> case IM.member ((i-1) `div` 2) x of
+    True -> return $ return $ Atom i
+    False -> return $ fail $ "intToAtom: " ++ show i
+intToAtom i = fail $ "intToAtom: " ++ show i
hunk ./Atom.hs 119
-atomToPS :: Atom -> PackedString
-atomToPS (Atom i) = unsafePerformIO $  HT.lookup reverseTable i >>= \x -> case x of
+{-# NOINLINE toPackedString #-}
+toPackedString :: Atom -> PackedString
+toPackedString (Atom i) = unsafePerformIO $ readIORef (i `seq` reverseTable) >>= \x -> case IM.lookup ((i-1) `div` 2) x of
hunk ./Atom.hs 123
-    Nothing -> return $ error $ "atomToPS: " ++ show i
+    Nothing -> do
+        x' <- readIORef reverseTable
+        return $ error $ "toPackedString: " ++ show i ++ " " ++ (show (x,x'))