Changeset 12024 for third-party
- Timestamp:
- 08/09/06 07:28:26 (2 years ago)
- Location:
- third-party/HsJudy
- Files:
-
- 2 added
- 5 modified
- 5 moved
-
HsJudy.cabal (modified) (1 diff)
-
Judy/Hash.hs (moved) (moved from third-party/HsJudy/Judy/Map.hs) (18 diffs)
-
Judy/IntMap.hs (moved) (moved from third-party/HsJudy/Judy/Map2.hs) (22 diffs)
-
Judy/StrMap.hs (moved) (moved from third-party/HsJudy/Judy/MapSL.hs) (16 diffs)
-
Judy/Stringable.hs (added)
-
Makefile (modified) (1 diff)
-
tests/CheckDup.hs (modified) (2 diffs)
-
tests/TestHash.hs (moved) (moved from third-party/HsJudy/tests/TestMap.hs) (2 diffs)
-
tests/TestIntMap.hs (moved) (moved from third-party/HsJudy/tests/TestMap2.hs) (15 diffs)
-
tests/TestStrMap.hs (added)
-
tests/atom/JudyAtom.hs (modified) (2 diffs)
-
tests/k-judy.hs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
third-party/HsJudy/HsJudy.cabal
r11676 r12024 7 7 maintainer: Caio Marcelo de Oliveira Filho <cmarcelo@gmail.com> 8 8 build-depends: base 9 exposed-modules: Judy.BitSet Judy.Freeze Judy. Map Judy.Map2 Judy.MapSL Judy.CollectionsM Judy.HashIO Judy.Refeable9 exposed-modules: Judy.BitSet Judy.Freeze Judy.Hash Judy.IntMap Judy.StrMap Judy.CollectionsM Judy.HashIO Judy.Refeable Judy.Stringable 10 10 other-modules: Judy.Private Judy.MiniGC 11 11 extensions: ForeignFunctionInterface -
third-party/HsJudy/Judy/Hash.hs
r11716 r12024 1 1 {-# OPTIONS -fallow-undecidable-instances -fallow-incoherent-instances #-} 2 2 3 module Judy. Map(3 module Judy.Hash ( 4 4 Stringable (..), 5 Map(..),5 Hash (..), 6 6 7 7 -- FIXME: need to move to MapM api … … 19 19 import Foreign 20 20 import Data.Maybe (fromJust) 21 import qualified Data.ByteString as B22 21 23 22 import Judy.Private … … 25 24 import Judy.Refeable 26 25 import Judy.Freeze 26 import Judy.Stringable 27 27 import qualified Judy.MiniGC as GC 28 28 29 29 import Prelude hiding (map) 30 30 31 -- Refeable is now in Judy/Refeable.hs32 33 {- Stringable stuff -}34 -- TODO: Work on Storable to let any Storable type be35 -- "stringable" i.e., used as Key.36 37 -- TODO: Support using ByteStrings, seems to be trivial with Stringable, just instantiate?38 39 class Stringable k where40 toString :: k -> String41 fromString :: String -> k42 43 useAsCS :: k -> (CString -> IO a) -> IO a44 useAsCS k = withCAString (toString k)45 useAsCSLen :: k -> (CStringLen -> IO a) -> IO a46 useAsCSLen k = withCAStringLen (toString k)47 48 copyCS :: CString -> IO k49 copyCS c = peekCAString c >>= return . fromString50 copyCSLen :: CStringLen -> IO k51 copyCSLen c = peekCAStringLen c >>= return . fromString52 53 instance Stringable String where54 toString = id55 fromString = id56 57 instance Stringable B.ByteString where58 toString = undefined59 fromString = undefined60 61 useAsCS = B.useAsCString62 useAsCSLen = B.useAsCStringLen63 64 copyCS = B.copyCString65 copyCSLen = B.copyCStringLen66 67 68 --instance Stringable Int where69 -- toString = show70 -- fromString = read71 {- End of Stringable stuff -}72 73 31 -- FIXME: really necessary/useful restrict types here? 74 newtype (Stringable k, Refeable a) => Map k a = Map{ judy :: ForeignPtr JudyHS }32 newtype (Stringable k, Refeable a) => Hash k a = Hash { judy :: ForeignPtr JudyHS } 75 33 deriving (Eq, Ord, Typeable) 76 34 77 instance (Stringable k, Refeable a) => CM.MapM ( Mapk a) k a IO where35 instance (Stringable k, Refeable a) => CM.MapM (Hash k a) k a IO where 78 36 new = new_ 79 37 delete = delete_ … … 88 46 mapToList = mapToList_ 89 47 90 instance (Stringable k, Refeable a) => Freezable ( Mapk a) where48 instance (Stringable k, Refeable a) => Freezable (Hash k a) where 91 49 freeze m = do 92 50 m' <- new_ … … 94 52 return (Frozen m') 95 53 96 instance (Stringable k, Refeable a) => CM.MapF (Frozen ( Mapk a)) k a where54 instance (Stringable k, Refeable a) => CM.MapF (Frozen (Hash k a)) k a where 97 55 memberF k (Frozen m) = unsafePerformIO $ member_ k m 98 56 lookupF k (Frozen m) = unsafePerformIO $ lookup_ k m … … 100 58 toListF (Frozen m) = unsafePerformIO $ toList_ m 101 59 102 instance Show ( Mapk a) where103 show ( Map j) = "<Map" ++ show j ++ ">"60 instance Show (Hash k a) where 61 show (Hash j) = "<Hash " ++ show j ++ ">" 104 62 105 63 foreign import ccall "wrapper" mkFin :: (Ptr JudyHS -> IO ()) -> IO (FunPtr (Ptr JudyHS -> IO ())) … … 109 67 when need $ do 110 68 j_ <- newForeignPtr_ j 111 es <- rawElems ( Mapj_)69 es <- rawElems (Hash j_) 112 70 mapM_ GC.freeRef es 113 71 v <- judyHSFreeArray j judyError … … 117 75 rawElems = internalMap $ \r _ _ -> peek r 118 76 119 dummy :: Refeable a => Mapk a -> a77 dummy :: Refeable a => Hash k a -> a 120 78 dummy = undefined 121 79 122 80 123 new_ :: Refeable a => IO ( Mapk a)81 new_ :: Refeable a => IO (Hash k a) 124 82 new_ = do 125 83 fp <- mallocForeignPtr 126 84 withForeignPtr fp $ flip poke nullPtr 127 m <- return $ Mapfp85 m <- return $ Hash fp 128 86 129 87 finalize' <- mkFin $ finalize $ needGC (dummy m) … … 131 89 return m 132 90 133 insert_ :: (Stringable k, Refeable a) => k -> a -> Mapk a -> IO ()134 insert_ k v ( Mapj) = withForeignPtr j $ \j' -> do91 insert_ :: (Stringable k, Refeable a) => k -> a -> Hash k a -> IO () 92 insert_ k v (Hash j) = withForeignPtr j $ \j' -> do 135 93 useAsCSLen k $ \(cp, len) -> do 136 94 -- TODO: maybe there's a better way to convert Int -> Value … … 143 101 return () 144 102 145 alter_ :: (Eq a, Stringable k, Refeable a) => (Maybe a -> Maybe a) -> k -> Mapk a -> IO (Maybe a)146 alter_ f k m@( Mapj) = do103 alter_ :: (Eq a, Stringable k, Refeable a) => (Maybe a -> Maybe a) -> k -> Hash k a -> IO (Maybe a) 104 alter_ f k m@(Hash j) = do 147 105 j' <- withForeignPtr j peek 148 106 useAsCSLen k $ \(cp, len) -> do … … 166 124 else return fv 167 125 168 lookup_ :: (Stringable k, Refeable a) => k -> Mapk a -> IO (Maybe a)169 lookup_ k ( Mapj) = do126 lookup_ :: (Stringable k, Refeable a) => k -> Hash k a -> IO (Maybe a) 127 lookup_ k (Hash j) = do 170 128 j' <- withForeignPtr j peek 171 129 useAsCSLen k $ \(cp, len) -> do … … 178 136 return $ Just v 179 137 180 member_ :: Stringable k => k -> Mapk a -> IO Bool181 member_ k ( Mapj) = do138 member_ :: Stringable k => k -> Hash k a -> IO Bool 139 member_ k (Hash j) = do 182 140 j' <- withForeignPtr j peek 183 141 useAsCSLen k $ \(cp, len) -> do … … 185 143 return $ r /= nullPtr 186 144 187 delete_ :: Stringable k => k -> Mapk a -> IO Bool188 delete_ k m@( Mapj) = withForeignPtr j $ \j' -> do145 delete_ :: Stringable k => k -> Hash k a -> IO Bool 146 delete_ k m@(Hash j) = withForeignPtr j $ \j' -> do 189 147 j'' <- peek j' 190 148 useAsCSLen k $ \(cp, len) -> do … … 199 157 return $ r /= 0 200 158 201 -- FIXME: may use MapIter type to enforce some safety in its use?202 newtype MapIter = MapIter { iter :: ForeignPtr JudyHSIter }159 -- FIXME: may use HashIter type to enforce some safety in its use? 160 newtype HashIter = HashIter { iter :: ForeignPtr JudyHSIter } 203 161 deriving (Eq, Ord, Typeable) 204 162 205 instance Show MapIter where206 show ( MapIter i) = "<Iter "++ show i ++ ">"207 208 209 newIter :: IO ( MapIter)163 instance Show HashIter where 164 show (HashIter i) = "<Iter "++ show i ++ ">" 165 166 167 newIter :: IO (HashIter) 210 168 newIter = do 211 169 fp <- mallocForeignPtr 212 170 -- addForeignPtrFinalizer judyHSIter_free_ptr fp 213 171 withForeignPtr fp $ flip poke nullPtr 214 return $ MapIter fp215 216 fromList_ :: (Stringable k, Refeable a) => [(k,a)] -> IO ( Mapk a)172 return $ HashIter fp 173 174 fromList_ :: (Stringable k, Refeable a) => [(k,a)] -> IO (Hash k a) 217 175 fromList_ xs = do 218 176 m <- new_ … … 220 178 return m 221 179 222 internalMap :: (Ptr Value -> Ptr CString -> Ptr Value -> IO b) -> Mapk a -> IO [b]223 internalMap f ( Mapj) = do180 internalMap :: (Ptr Value -> Ptr CString -> Ptr Value -> IO b) -> Hash k a -> IO [b] 181 internalMap f (Hash j) = do 224 182 jj <- withForeignPtr j peek 225 ( MapIter i) <- newIter183 (HashIter i) <- newIter 226 184 withForeignPtr i $ \ii -> alloca $ \cp -> alloca $ \len -> do 227 185 poke len 0 … … 235 193 loop judyHSIterFirst [] 236 194 237 mapToList_ :: (Stringable k, Refeable a) => (k -> a -> b) -> Mapk a -> IO [b]195 mapToList_ :: (Stringable k, Refeable a) => (k -> a -> b) -> Hash k a -> IO [b] 238 196 mapToList_ f = internalMap $ \r cp len -> do 239 197 l <- peek len … … 244 202 return $ f v d' 245 203 246 toList_ :: (Stringable k, Refeable a) => Mapk a -> IO [(k,a)]204 toList_ :: (Stringable k, Refeable a) => Hash k a -> IO [(k,a)] 247 205 toList_ = mapToList_ $ \k a -> (k, a) 248 206 249 elems_ :: Refeable a => Mapk a -> IO [a]207 elems_ :: Refeable a => Hash k a -> IO [a] 250 208 elems_ = internalMap $ \r _ _ -> do 251 209 d <- peek r 252 210 fromRef d 253 211 254 keys_ :: Stringable k => Mapk a -> IO [k]212 keys_ :: Stringable k => Hash k a -> IO [k] 255 213 keys_ = internalMap $ \_ cp len -> do 256 214 l <- peek len … … 260 218 261 219 262 swapMaps :: Map k a -> Mapk a -> IO ()263 swapMaps ( Map j1) (Mapj2) = do220 swapMaps :: Hash k a -> Hash k a -> IO () 221 swapMaps (Hash j1) (Hash j2) = do 264 222 withForeignPtr j1 $ \p1 -> withForeignPtr j2 $ \p2 -> do 265 223 v1 <- peek p1 -
third-party/HsJudy/Judy/IntMap.hs
r11917 r12024 1 1 {-# OPTIONS -fallow-undecidable-instances -fallow-incoherent-instances #-} 2 2 3 module Judy. Map2(4 Map2(..),3 module Judy.IntMap ( 4 IntMap (..), 5 5 swapMaps, freeze, 6 6 toRevList, … … 31 31 import Prelude hiding (map) 32 32 33 newtype (ReversibleHashIO k, Refeable a) => Map2 k a = Map2{ judy :: ForeignPtr JudyL }33 newtype (ReversibleHashIO k, Refeable a) => IntMap k a = IntMap { judy :: ForeignPtr JudyL } 34 34 deriving (Eq, Ord, Typeable) 35 35 36 instance (ReversibleHashIO k, Refeable a) => CM.MapM ( Map2k a) k a IO where36 instance (ReversibleHashIO k, Refeable a) => CM.MapM (IntMap k a) k a IO where 37 37 new = new_ 38 38 delete = delete_ … … 47 47 mapToList = mapToList_ 48 48 49 instance (ReversibleHashIO k, Refeable a) => Freezable ( Map2k a) where49 instance (ReversibleHashIO k, Refeable a) => Freezable (IntMap k a) where 50 50 freeze m = do 51 51 m' <- new_ … … 53 53 return (Frozen m') 54 54 55 instance (ReversibleHashIO k, Refeable a) => CM.MapF (Frozen ( Map2k a)) k a where55 instance (ReversibleHashIO k, Refeable a) => CM.MapF (Frozen (IntMap k a)) k a where 56 56 memberF k (Frozen m) = unsafePerformIO $ member_ k m 57 57 lookupF k (Frozen m) = unsafePerformIO $ lookup_ k m … … 59 59 toListF (Frozen m) = unsafePerformIO $ toList_ m 60 60 61 instance Show ( Map2k a) where62 show ( Map2 j) = "<Map2" ++ show j ++ ">"61 instance Show (IntMap k a) where 62 show (IntMap j) = "<IntMap " ++ show j ++ ">" 63 63 64 64 … … 70 70 when need $ do 71 71 j_ <- newForeignPtr_ j 72 es <- rawElems ( Map2j_)72 es <- rawElems (IntMap j_) 73 73 mapM_ GC.freeRef es 74 74 v <- judyLFreeArray j judyError … … 78 78 rawElems = internalMap $ \r _ -> peek r 79 79 80 dummy :: Refeable a => Map2k a -> a80 dummy :: Refeable a => IntMap k a -> a 81 81 dummy = undefined 82 82 83 new_ :: Refeable a => IO ( Map2k a)83 new_ :: Refeable a => IO (IntMap k a) 84 84 new_ = do 85 85 fp <- mallocForeignPtr 86 86 withForeignPtr fp $ flip poke nullPtr 87 m <- return $ Map2fp87 m <- return $ IntMap fp 88 88 89 89 finalize' <- mkFin $ finalize $ needGC (dummy m) … … 91 91 return m 92 92 93 insert_ :: (ReversibleHashIO k, Refeable a) => k -> a -> Map2k a -> IO ()94 insert_ k v ( Map2j) = withForeignPtr j $ \j' -> do93 insert_ :: (ReversibleHashIO k, Refeable a) => k -> a -> IntMap k a -> IO () 94 insert_ k v (IntMap j) = withForeignPtr j $ \j' -> do 95 95 k' <- hashIO k 96 96 r <- judyLIns j' k' judyError … … 99 99 else do { v' <- toRef v; poke r v'; return () } 100 100 101 alter_ :: (Eq a, ReversibleHashIO k, Refeable a) => (Maybe a -> Maybe a) -> k -> Map2k a -> IO (Maybe a)102 alter_ f k m@( Map2j) = do101 alter_ :: (Eq a, ReversibleHashIO k, Refeable a) => (Maybe a -> Maybe a) -> k -> IntMap k a -> IO (Maybe a) 102 alter_ f k m@(IntMap j) = do 103 103 j' <- withForeignPtr j peek 104 104 k' <- hashIO k … … 122 122 else return fv 123 123 124 lookup_ :: (ReversibleHashIO k, Refeable a) => k -> Map2k a -> IO (Maybe a)125 lookup_ k ( Map2j) = do124 lookup_ :: (ReversibleHashIO k, Refeable a) => k -> IntMap k a -> IO (Maybe a) 125 lookup_ k (IntMap j) = do 126 126 j' <- withForeignPtr j peek 127 127 k' <- hashIO k … … 131 131 else do { v' <- peek r; v <- fromRef v'; return $ Just v } 132 132 133 member_ :: ReversibleHashIO k => k -> Map2k a -> IO Bool134 member_ k ( Map2j) = do133 member_ :: ReversibleHashIO k => k -> IntMap k a -> IO Bool 134 member_ k (IntMap j) = do 135 135 j' <- withForeignPtr j peek 136 136 k' <- hashIO k … … 138 138 return $ r /= nullPtr 139 139 140 delete_ :: ReversibleHashIO k => k -> Map2k a -> IO Bool141 delete_ k m@( Map2j) = withForeignPtr j $ \j' -> do140 delete_ :: ReversibleHashIO k => k -> IntMap k a -> IO Bool 141 delete_ k m@(IntMap j) = withForeignPtr j $ \j' -> do 142 142 j'' <- peek j' 143 143 k' <- hashIO k … … 152 152 return $ r /= 0 153 153 154 size :: Map2k a -> IO Int155 size ( Map2j) = withForeignPtr j $ \j' -> do154 size :: IntMap k a -> IO Int 155 size (IntMap j) = withForeignPtr j $ \j' -> do 156 156 jj <- peek j' 157 157 r <- judyLCount jj 0 (-1) judyError … … 160 160 161 161 162 fromList_ :: (ReversibleHashIO k, Refeable a) => [(k,a)] -> IO ( Map2k a)162 fromList_ :: (ReversibleHashIO k, Refeable a) => [(k,a)] -> IO (IntMap k a) 163 163 fromList_ xs = do 164 164 m <- new_ … … 166 166 return m 167 167 168 internalMap' :: (Ptr Value -> Ptr Value -> IO b) -> Map2k a -> IO [b]169 internalMap' f ( Map2j) = do168 internalMap' :: (Ptr Value -> Ptr Value -> IO b) -> IntMap k a -> IO [b] 169 internalMap' f (IntMap j) = do 170 170 jj <- withForeignPtr j peek 171 171 alloca $ \vp -> do … … 179 179 loop judyLFirst [] 180 180 181 withLast :: (Ptr Value -> Ptr Value -> IO b) -> Int -> Map2k a -> IO [b]182 withLast f n ( Map2j) = do181 withLast :: (Ptr Value -> Ptr Value -> IO b) -> Int -> IntMap k a -> IO [b] 182 withLast f n (IntMap j) = do 183 183 jj <- withForeignPtr j peek 184 184 alloca $ \vp -> do … … 193 193 loop judyLLast [] n 194 194 195 takeLast :: (ReversibleHashIO k, Refeable a) => Int -> IntMap k a -> IO [(k,a)] 196 -- this case is here as a tentative to optimize, in case GHC doesn't do it 197 takeLast 1 (IntMap j) = do 198 jj <- withForeignPtr j peek 199 alloca $ \vp -> do 200 poke vp (-1) 201 r <- judyLLast jj vp judyError 202 if r == nullPtr 203 then return [] 204 else do k <- peek vp >>= unHashIO 205 v <- peek r >>= fromRef 206 return [(k,v)] 195 207 -- FIXME: use a less obscure syntax =P 196 takeLast :: (ReversibleHashIO k, Refeable a) => Int -> Map2 k a -> IO [(k,a)]197 208 takeLast n m = do 198 209 withLast (\r vp -> do { k <- peek vp >>= unHashIO; v <- peek r >>= fromRef; return (k,v) }) n m 199 210 200 takeLastElems :: Refeable a => Int -> Map2k a -> IO [a]211 takeLastElems :: Refeable a => Int -> IntMap k a -> IO [a] 201 212 takeLastElems n m = do 202 213 withLast (\r _ -> peek r >>= fromRef) n m … … 205 216 206 217 207 withFirst :: (Ptr Value -> Ptr Value -> IO b) -> Int -> Map2k a -> IO [b]208 withFirst f n ( Map2j) = do218 withFirst :: (Ptr Value -> Ptr Value -> IO b) -> Int -> IntMap k a -> IO [b] 219 withFirst f n (IntMap j) = do 209 220 jj <- withForeignPtr j peek 210 221 alloca $ \vp -> do … … 223 234 224 235 236 takeFirst :: (ReversibleHashIO k, Refeable a) => Int -> IntMap k a -> IO [(k,a)] 237 -- this case is here as a tentative to optimize, in case GHC doesn't do it 238 takeFirst 1 (IntMap j) = do 239 jj <- withForeignPtr j peek 240 alloca $ \vp -> do 241 poke vp (0 :: Value) 242 r <- judyLFirst jj vp judyError 243 if r == nullPtr 244 then return [] 245 else do k <- peek vp >>= unHashIO 246 v <- peek r >>= fromRef 247 return [(k,v)] 225 248 -- FIXME: use a less obscure syntax =P 226 takeFirst :: (ReversibleHashIO k, Refeable a) => Int -> Map2 k a -> IO [(k,a)]227 249 takeFirst n m = do 228 250 l <- withFirst (\r vp -> do { k <- peek vp >>= unHashIO; v <- peek r >>= fromRef; return (k,v) }) n m 229 251 return $ reverse l 230 252 231 takeFirstElems :: Refeable a => Int -> Map2k a -> IO [a]253 takeFirstElems :: Refeable a => Int -> IntMap k a -> IO [a] 232 254 takeFirstElems n m = do 233 255 l <- withFirst (\r _ -> peek r >>= fromRef) n m 234 256 return $ reverse l 235 257 236 internalMap :: (Ptr Value -> Ptr Value -> IO b) -> Map2k a -> IO [b]237 internalMap f ( Map2j) = do258 internalMap :: (Ptr Value -> Ptr Value -> IO b) -> IntMap k a -> IO [b] 259 internalMap f (IntMap j) = do 238 260 jj <- withForeignPtr j peek 239 261 alloca $ \vp -> do … … 248 270 -- to get ordered list right. 249 271 250 mapToList_ :: (ReversibleHashIO k, Refeable a) => (k -> a -> b) -> Map2k a -> IO [b]272 mapToList_ :: (ReversibleHashIO k, Refeable a) => (k -> a -> b) -> IntMap k a -> IO [b] 251 273 mapToList_ f = internalMap $ \r vp -> do 252 274 k <- peek vp … … 256 278 return $ f k' v' 257 279 258 mapToRevList_ :: (ReversibleHashIO k, Refeable a) => (k -> a -> b) -> Map2k a -> IO [b]280 mapToRevList_ :: (ReversibleHashIO k, Refeable a) => (k -> a -> b) -> IntMap k a -> IO [b] 259 281 mapToRevList_ f = internalMap' $ \r vp -> do 260 282 k <- peek vp … … 264 286 return $ f k' v' 265 287 266 toList_ :: (ReversibleHashIO k, Refeable a) => Map2k a -> IO [(k,a)]288 toList_ :: (ReversibleHashIO k, Refeable a) => IntMap k a -> IO [(k,a)] 267 289 toList_ = mapToList_ $ \k a -> (k,a) 268 290 269 toRevList :: (ReversibleHashIO k, Refeable a) => Map2k a -> IO [(k,a)]291 toRevList :: (ReversibleHashIO k, Refeable a) => IntMap k a -> IO [(k,a)] 270 292 toRevList = mapToRevList_ $ \k a -> (k,a) 271 293 272 keys_ :: ReversibleHashIO k => Map2k a -> IO [k]294 keys_ :: ReversibleHashIO k => IntMap k a -> IO [k] 273 295 keys_ = internalMap $ \_ vp -> do 274 296 k <- peek vp 275 297 unHashIO k 276 298 277 elems_ :: Refeable a => Map2k a -> IO [a]299 elems_ :: Refeable a => IntMap k a -> IO [a] 278 300 elems_ = internalMap $ \r _ -> do 279 301 v <- peek r 280 302 fromRef v 281 303 282 swapMaps :: Map2 k a -> Map2k a -> IO ()283 swapMaps ( Map2 j1) (Map2j2) = do304 swapMaps :: IntMap k a -> IntMap k a -> IO () 305 swapMaps (IntMap j1) (IntMap j2) = do 284 306 withForeignPtr j1 $ \p1 -> withForeignPtr j2 $ \p2 -> do 285 307 v1 <- peek p1 -
third-party/HsJudy/Judy/StrMap.hs
r11917 r12024 1 1 {-# OPTIONS -fallow-undecidable-instances -fallow-incoherent-instances #-} 2 2 3 module Judy.MapSL ( 4 MapSL (..), 5 swapMaps, freeze 3 module Judy.StrMap ( 4 StrMap (..), 5 swapMaps, 6 freeze, 7 toRevList 6 8 ) where 7 9 … … 21 23 import qualified Judy.CollectionsM as CM 22 24 import Judy.Refeable 23 import Judy. Map (Stringable (..))25 import Judy.Stringable 24 26 import Judy.Freeze 25 27 import qualified Judy.MiniGC as GC … … 27 29 import Prelude hiding (map) 28 30 29 newtype (Stringable k, Refeable a) => MapSL k a = MapSL{ judy :: ForeignPtr JudySL }31 newtype (Stringable k, Refeable a) => StrMap k a = StrMap { judy :: ForeignPtr JudySL } 30 32 deriving (Eq, Ord, Typeable) 31 33 32 instance (Stringable k, Refeable a) => CM.MapM ( MapSLk a) k a IO where34 instance (Stringable k, Refeable a) => CM.MapM (StrMap k a) k a IO where 33 35 new = new_ 34 36 delete = delete_ … … 43 45 mapToList = mapToList_ 44 46 45 instance (Stringable k, Refeable a) => Freezable ( MapSLk a) where47 instance (Stringable k, Refeable a) => Freezable (StrMap k a) where 46 48 freeze m = do 47 49 m' <- new_ … … 49 51 return (Frozen m') 50 52 51 instance (Stringable k, Refeable a) => CM.MapF (Frozen ( MapSLk a)) k a where53 instance (Stringable k, Refeable a) => CM.MapF (Frozen (StrMap k a)) k a where 52 54 memberF k (Frozen m) = unsafePerformIO $ member_ k m 53 55 lookupF k (Frozen m) = unsafePerformIO $ lookup_ k m … … 55 57 toListF (Frozen m) = unsafePerformIO $ toList_ m 56 58 57 instance Show ( MapSLk a) where58 show ( MapSL j) = "<MapSL" ++ show j ++ ">"59 instance Show (StrMap k a) where 60 show (StrMap j) = "<StrMap " ++ show j ++ ">" 59 61 60 62 foreign import ccall "wrapper" mkFin :: (Ptr JudySL -> IO ()) -> IO (FunPtr (Ptr JudySL -> IO ())) … … 65 67 when need $ do 66 68 j_ <- newForeignPtr_ j 67 es <- rawElems ( MapSLj_)69 es <- rawElems (StrMap j_) 68 70 mapM_ GC.freeRef es 69 71 v <- judySLFreeArray j judyError … … 73 75 rawElems = internalMap $ \r _ -> peek r 74 76 75 dummy :: Refeable a => MapSLk a -> a77 dummy :: Refeable a => StrMap k a -> a 76 78 dummy = undefined 77 79 78 new_ :: Refeable a => IO ( MapSLk a)80 new_ :: Refeable a => IO (StrMap k a) 79 81 new_ = do 80 82 fp <- mallocForeignPtr 81 83 withForeignPtr fp $ flip poke nullPtr
