Changeset 2624 for src/Pugs/Types

Show
Ignore:
Timestamp:
05/02/05 17:28:22 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
4152
Message:

* switch IArray implementation to IntMap?.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Types/Array.hs

    r2541 r2624  
    126126    array_store av vals = do 
    127127        let svList = map lazyScalar vals 
    128         liftSTM $ writeTVar av svList 
     128        liftSTM $ writeTVar av $ IntMap.fromAscList ([0..] `zip` svList) 
    129129    array_fetchSize av = do 
    130         svList <- liftSTM $ readTVar av 
    131         return $ length svList 
     130        avMap <- liftSTM $ readTVar av 
     131        return $ IntMap.size avMap 
    132132    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) 
    134140    array_shift av = do 
    135         svList <- liftSTM $ readTVar av 
     141        svList <- liftSTM $ fmap IntMap.elems $ readTVar av 
    136142        case svList of 
    137143            (sv:rest) -> do 
    138                 liftSTM $ writeTVar av rest 
     144                liftSTM $ writeTVar av $ IntMap.fromAscList ([0..] `zip` rest) 
    139145                readIVar sv 
    140146            _ -> return undef 
    141147    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)) 
    144151    array_extendSize _ 0 = return () 
    145152    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) 
    150160    array_fetchVal av idx = do 
    151         readIVar =<< getIndex idx (Just $ constScalar undef) 
     161        readIVar =<< getMapIndex idx (Just $ constScalar undef) 
    152162            (liftSTM $ readTVar av)  
    153163            Nothing -- don't bother extending 
    154164    array_fetchKeys av = do 
    155         svList <- liftSTM $ readTVar av 
    156         return $ zipWith const [0..] svList 
     165        avMap <- liftSTM $ readTVar av 
     166        return $ IntMap.keys avMap 
    157167    array_fetchElem av idx = do 
    158         sv <- getIndex idx Nothing 
     168        sv <- getMapIndex idx Nothing 
    159169            (liftSTM $ readTVar av)  
    160170            (Just (array_extendSize av $ idx+1)) 
     
    163173                val <- readIVar sv 
    164174                sv' <- newScalar val 
    165                 liftSTM . modifyTVar av $ \svList -> 
    166                     let idx' = idx `mod` length svList in 
    167                     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 
    168178                return sv' 
    169179            else return sv 
    170180    array_existsElem av idx | idx < 0 = array_existsElem av (abs idx - 1) 
    171181    array_existsElem av idx = do 
    172         svList <- liftSTM $ readTVar av 
    173         return . not . null $ drop idx svList 
     182        avMap <- liftSTM $ readTVar av 
     183        return $ IntMap.member idx avMap 
    174184    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 
    177188                     | 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 
    181193    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 
    184197                     | 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)) 
    186202 
    187203instance ArrayClass VArray where