Changeset 2624 for src/Pugs/Types
- Timestamp:
- 05/02/05 17:28:22 (4 years ago)
- svk:copy_cache_prev:
- 4152
- Files:
-
- 1 modified
-
src/Pugs/Types/Array.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Types/Array.hs
r2541 r2624 126 126 array_store av vals = do 127 127 let svList = map lazyScalar vals 128 liftSTM $ writeTVar av svList128 liftSTM $ writeTVar av $ IntMap.fromAscList ([0..] `zip` svList) 129 129 array_fetchSize av = do 130 svList<- liftSTM $ readTVar av131 return $ length svList130 avMap <- liftSTM $ readTVar av 131 return $ IntMap.size avMap 132 132 array_storeSize av sz = do 133 liftSTM $ modifyTVar av $ take sz . (++ repeat lazyUndef) 133 liftSTM $ modifyTVar av $ \avMap -> 134 let size = IntMap.size avMap in 135 case size `compare` sz of 136 GT -> fst $ IntMap.split sz avMap 137 EQ -> avMap 138 LT -> IntMap.union avMap $ 139 IntMap.fromAscList ([size .. sz-1] `zip` repeat lazyUndef) 134 140 array_shift av = do 135 svList <- liftSTM $ readTVar av141 svList <- liftSTM $ fmap IntMap.elems $ readTVar av 136 142 case svList of 137 143 (sv:rest) -> do 138 liftSTM $ writeTVar av rest144 liftSTM $ writeTVar av $ IntMap.fromAscList ([0..] `zip` rest) 139 145 readIVar sv 140 146 _ -> return undef 141 147 array_unshift av vals = do 142 liftSTM $ modifyTVar av 143 (map lazyScalar vals ++) 148 liftSTM $ modifyTVar av $ \avMap -> 149 let svList = IntMap.elems avMap in 150 IntMap.fromAscList ([0..] `zip` ((map lazyScalar vals) ++ svList)) 144 151 array_extendSize _ 0 = return () 145 152 array_extendSize av sz = do 146 liftSTM . modifyTVar av $ \svList -> 147 if null $ drop (sz-1) svList 148 then take sz (svList ++ repeat lazyUndef) 149 else svList 153 liftSTM $ modifyTVar av $ \avMap -> 154 let size = IntMap.size avMap in 155 case size `compare` sz of 156 GT -> avMap 157 EQ -> avMap 158 LT -> IntMap.union avMap $ 159 IntMap.fromAscList ([size .. sz-1] `zip` repeat lazyUndef) 150 160 array_fetchVal av idx = do 151 readIVar =<< get Index idx (Just $ constScalar undef)161 readIVar =<< getMapIndex idx (Just $ constScalar undef) 152 162 (liftSTM $ readTVar av) 153 163 Nothing -- don't bother extending 154 164 array_fetchKeys av = do 155 svList<- liftSTM $ readTVar av156 return $ zipWith const [0..] svList165 avMap <- liftSTM $ readTVar av 166 return $ IntMap.keys avMap 157 167 array_fetchElem av idx = do 158 sv <- get Index idx Nothing168 sv <- getMapIndex idx Nothing 159 169 (liftSTM $ readTVar av) 160 170 (Just (array_extendSize av $ idx+1)) … … 163 173 val <- readIVar sv 164 174 sv' <- newScalar val 165 liftSTM . modifyTVar av $ \ svList->166 let idx' = idx `mod` length svListin167 take idx' svList ++ (sv' : drop (idx'+1) svList)175 liftSTM . modifyTVar av $ \avMap -> 176 let idx' = idx `mod` IntMap.size avMap in 177 IntMap.adjust (const sv') idx' avMap 168 178 return sv' 169 179 else return sv 170 180 array_existsElem av idx | idx < 0 = array_existsElem av (abs idx - 1) 171 181 array_existsElem av idx = do 172 svList<- liftSTM $ readTVar av173 return . not . null $ drop idx svList182 avMap <- liftSTM $ readTVar av 183 return $ IntMap.member idx avMap 174 184 array_deleteElem av idx = do 175 liftSTM . modifyTVar av $ \svList -> 176 let idx' | idx < 0 = idx `mod` length svList -- XXX wrong; wraparound 185 liftSTM . modifyTVar av $ \avMap -> 186 let size = IntMap.size avMap 187 idx' | idx < 0 = idx `mod` IntMap.size avMap -- XXX wrong; wraparound 177 188 | otherwise = idx in 178 if null $ drop (idx' + 1) svList 179 then take idx' svList 180 else take idx' svList ++ (lazyUndef : drop (idx'+1) svList) 189 case (size - 1) `compare` idx' of 190 LT -> avMap 191 EQ -> IntMap.delete idx' avMap 192 GT -> IntMap.adjust (const lazyUndef) idx' avMap 181 193 array_storeElem av idx sv = do 182 liftSTM . modifyTVar av $ \svList -> 183 let idx' | idx < 0 = idx `mod` length svList -- XXX wrong; wraparound 194 liftSTM . modifyTVar av $ \avMap -> 195 let size = IntMap.size avMap 196 idx' | idx < 0 = idx `mod` IntMap.size avMap -- XXX wrong; wraparound 184 197 | otherwise = idx in 185 take idx svList ++ (sv : drop (idx'+1) svList) 198 if size > idx' 199 then IntMap.adjust (const sv) idx' avMap 200 else IntMap.union avMap $ 201 IntMap.fromAscList ([size .. idx'] `zip` (sv:repeat lazyUndef)) 186 202 187 203 instance ArrayClass VArray where
