Changeset 11899 for third-party
- Timestamp:
- 08/03/06 18:34:00 (2 years ago)
- Location:
- third-party/HsJudy
- Files:
-
- 1 added
- 2 modified
-
Judy/Map2.hs (modified) (4 diffs)
-
tests/Test.hs (added)
-
tests/TestMap2.hs (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
third-party/HsJudy/Judy/Map2.hs
r11831 r11899 3 3 module Judy.Map2 ( 4 4 Map2 (..), 5 swapMaps, freeze, toRevList 5 swapMaps, freeze, 6 toRevList, 7 size, 8 takeFirstElems, takeFirst, 9 takeLastElems, takeLast 6 10 ) where 7 11 … … 148 152 return $ r /= 0 149 153 154 size :: Map2 k a -> IO Int 155 size (Map2 j) = withForeignPtr j $ \j' -> do 156 jj <- peek j' 157 r <- judyLCount jj 0 (-1) judyError 158 return $ fromEnum r 159 160 150 161 151 162 fromList_ :: (ReversibleHashIO k, Refeable a) => [(k,a)] -> IO (Map2 k a) … … 155 166 return m 156 167 157 --count j i1 i2 = withForeignPtr j $ \j -> do158 -- jj <- peek j159 -- r <- judyLCount jj i1 i2 judyError160 -- return $ r161 162 163 168 internalMap' :: (Ptr Value -> Ptr Value -> IO b) -> Map2 k a -> IO [b] 164 169 internalMap' f (Map2 j) = do … … 173 178 loop judyLNext (x:xs) 174 179 loop judyLFirst [] 180 181 withLast :: (Ptr Value -> Ptr Value -> IO b) -> Int -> Map2 k a -> IO [b] 182 withLast f n (Map2 j) = do 183 jj <- withForeignPtr j peek 184 alloca $ \vp -> do 185 poke vp (-1) 186 let loop _ xs 0 = return xs 187 loop act xs n' = do 188 r <- act jj vp judyError 189 if r == nullPtr 190 then return xs 191 else do x <- f r vp 192 loop judyLPrev (x:xs) (n'-1) 193 loop judyLLast [] n 194 195 -- FIXME: use a less obscure syntax =P 196 takeLast :: (ReversibleHashIO k, Refeable a) => Int -> Map2 k a -> IO [(k,a)] 197 takeLast n m = do 198 withLast (\r vp -> do { k <- peek vp >>= unHashIO; v <- peek r >>= fromRef; return (k,v) }) n m 199 200 takeLastElems :: Refeable a => Int -> Map2 k a -> IO [a] 201 takeLastElems n m = do 202 withLast (\r _ -> peek r >>= fromRef) n m 203 204 205 206 207 withFirst :: (Ptr Value -> Ptr Value -> IO b) -> Int -> Map2 k a -> IO [b] 208 withFirst f n (Map2 j) = do 209 jj <- withForeignPtr j peek 210 alloca $ \vp -> do 211 poke vp (0 :: Value) 212 let loop _ xs 0 = return xs 213 loop act xs n' = do 214 r <- act jj vp judyError 215 if r == nullPtr 216 then return xs 217 else do x <- f r vp 218 loop judyLNext (x:xs) (n'-1) 219 loop judyLFirst [] n 220 221 -- FIXME: For n < size, is better use this approach, but for 222 -- n ~= size would be better to use LPrev and LLast and dont reverse. 223 224 225 -- FIXME: use a less obscure syntax =P 226 takeFirst :: (ReversibleHashIO k, Refeable a) => Int -> Map2 k a -> IO [(k,a)] 227 takeFirst n m = do 228 l <- withFirst (\r vp -> do { k <- peek vp >>= unHashIO; v <- peek r >>= fromRef; return (k,v) }) n m 229 return $ reverse l 230 231 takeFirstElems :: Refeable a => Int -> Map2 k a -> IO [a] 232 takeFirstElems n m = do 233 l <- withFirst (\r _ -> peek r >>= fromRef) n m 234 return $ reverse l 175 235 176 236 internalMap :: (Ptr Value -> Ptr Value -> IO b) -> Map2 k a -> IO [b] -
third-party/HsJudy/tests/TestMap2.hs
r11831 r11899 10 10 11 11 main = no_plan $ do 12 testSimple13 testDelete14 testOverwrite15 testMember16 testElems17 testKeys18 testStringValue19 testStringValueDel20 testSwapMaps21 testAlter22 testRevList23 12 24 testSimple = do 25 say "Simple" 13 t "Simple" $ do 26 14 s <- new :: IO (Map2 Int Int) 27 15 lookup 1 s .=> Nothing … … 29 17 lookup 1 s .=> Just 42 30 18 31 testDelete = do 32 say "Delete" 19 t "Delete" $ do 33 20 s <- new :: IO (Map2 Int Int) 34 21 lookup 3 s .=> Nothing … … 41 28 lookup 37 s .=> Just 59 42 29 43 testOverwrite = do 44 say "Overwrite" 30 t "Overwrite" $ do 45 31 s <- new :: IO (Map2 Int Int) 46 32 insert 3 1234 s … … 50 36 lookup 3 s .=> Just 42 51 37 52 testMember = do 53 say "Member" 38 t "Member" $ do 54 39 s <- new :: IO (Map2 Int Int) 55 40 member 3 s .=> False … … 60 45 member 3 s .=> True 61 46 62 testElems = do 63 say "Elems" 47 t "Elems" $ do 64 48 s <- new :: IO (Map2 Int Int) 65 49 elems s .=> [] … … 69 53 elems s .=> [2,42,1] 70 54 71 testKeys = do 72 say "Keys" 55 t "Keys" $ do 73 56 s <- new :: IO (Map2 Int Int) 74 57 keys s .-= [] … … 81 64 keys s .=> [0,3] 82 65 83 testStringValue = do 84 say "StringValue" 66 t "StringValue" $ do 85 67 s <- new :: IO (Map2 Int String) 86 68 toList s .-= [] … … 95 77 lookup 59 s .=> Just "i am not a number" 96 78 97 testStringValueDel = do 98 say "StringValueDel" 79 t "StringValueDel" $ do 99 80 s <- new :: IO (Map2 Int String) 100 81 toList s .-= [] … … 111 92 lookup 23 s .=> Just "string" 112 93 113 testSwapMaps = do 114 say "SwapMaps" 94 t "SwapMaps" $ do 115 95 m1 <- fromList [(1,2),(2,3),(4,7)] :: IO (J.Map2 Int Int) 116 96 m2 <- fromList [(1,42),(2,42),(3,42)] :: IO (J.Map2 Int Int) … … 124 104 lookup 3 m2 .=> Nothing 125 105 126 testAlter = do 127 say "Alter" 106 t "Alter" $ do 128 107 m <- fromList [(1,2), (2,3), (4,5)] :: IO (J.Map2 Int Int) 129 108 lookup 1 m .=> Just 2 … … 139 118 lookup 1 m .=> Nothing 140 119 141 testRevList = do 142 say "RevList" 120 t "RevList" $ do 143 121 let l = [(1,2), (2,3), (4,5)] 144 122 m <- fromList l :: IO (J.Map2 Int Int) … … 148 126 J.toRevList m .=> reverse (sort $ (3,10):l) 149 127 128 t "Size" $ do 129 let l = [0..] `zip` [1..20] 130 m <- fromList l :: IO (J.Map2 Int Int) 131 J.size m .=> 20 132 delete 0 m 133 delete 1 m 134 J.size m .=> 18 135 insert 2 3 m 136 insert 21 3 m 137 J.size m .=> 19 138 139 t "TakeFirst et al" $ do 140 let l = [0..100] `zip` [100..] 141 m <- fromList l :: IO (J.Map2 Int Int) 142 J.takeFirstElems 5 m .=> [100..104] 143 J.takeFirst 5 m .=> [0..] `zip` [100..104] 144 J.takeFirstElems 10 m .=> [100..109] 145 delete 0 m 146 delete 1 m 147 J.takeFirstElems 3 m .=> [102..104] 148 J.takeFirst 3 m .=> [2..4] `zip` [102..104] 149 150 t "TakeLast et al" $ do 151 let l = [0..100] `zip` [100..] 152 m <- fromList l :: IO (J.Map2 Int Int) 153 J.takeLastElems 5 m .=> [196..200] 154 J.takeLast 5 m .=> [96..] `zip` [196..200] 155 J.takeLastElems 10 m .=> [191..200] 156 delete 100 m 157 delete 99 m 158 J.takeLastElems 3 m .=> [196..198] 159 J.takeLast 3 m .=> [96..] `zip` [196..198] 160 150 161 -- TODO: test some crazy haskell type as value (to check stableptrs) 151
