
Hello Marc, Saturday, February 17, 2007, 7:48:15 PM, you wrote:
It would be much nicer to use class Empty where empty :: a
there are two libraries, Edisson and Collections, which includes large hierarchies of collection type classes about references. my program includes the following minilib: infixl 0 =:, +=, -=, ++=, .=, .<-, <<= -- Simple variables ref = newIORef new = newIORef val = readIORef a=:b = writeIORef a b a+=b = modifyIORef a (\a->a+b) a-=b = modifyIORef a (\a->a-b) a.=b = modifyIORef a (\a->b a) a++=b = modifyIORef a (\a->a++b) a.<-b = modifyIORefIO a (\a->b a) withRef init = with' (ref init) val -- Accumulation lists newtype AccList a = AccList [a] newList = ref$ AccList [] a<<=b = a .= (\(AccList x) -> AccList$ b:x) listVal a = val a >>== (\(AccList x) -> reverse x) withList = with' newList listVal addToIORef :: IORef [a] -> a -> IO () addToIORef var x = var .= (x:) modifyIORefIO :: IORef a -> (a -> IO a) -> IO () modifyIORefIO var action = do readIORef var >>= action >>= writeIORef var with' init finish action = do a <- init; action a; finish a usage examples: blocks <- withList $ \found -> do scanArchiveSearchingDescriptors archive arcname found buf arcsize scanArchiveSearchingDescriptors archive arcname found buf arcsize = do pos' <- ref base_pos ... pos' =: blPos block found <<= block pos <- val pos' if pos > base_pos ... processDir filelist = do let (dirs,files) = partition fiIsDir filelist files2delete ++= files dirs2delete ++= dirs let update_crc buf len = do when (block_type/=DATA_BLOCK) $ do crc .<- updateCRC buf len origsize += len errors' <- ref (length bad) ... when (crc/=original_crc) $ do errors' += 1 ... errors <- val errors' when (errors>0) $ do uiStartDeCompression = do time <- getCPUTime refArchiveProcessingTime -= time uiFinishDeCompression = do time <- getCPUTime refArchiveProcessingTime += time -- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com