packages feed

hid-examples-0.4: du/DiskUsage.hs

{-# LANGUAGE RecordWildCards, FlexibleContexts #-}

module DiskUsage (diskUsage) where

import Control.Monad.RWS
import System.FilePath (takeExtension)
import System.Posix.Types (FileOffset)
import System.PosixCompat.Files (FileStatus, getFileStatus,
                                 isDirectory, isRegularFile, fileSize)

import TraverseDir
import App

type DUApp = MyApp FileOffset

diskUsage :: DUApp ()
diskUsage = do
    maxDepth <- asks maxDepth
    AppState {..} <- get
    fs <- liftIO $ getFileStatus curPath
    let isDir = isDirectory fs
        shouldLog = isDir && curDepth <= maxDepth
    when isDir $ traverseDirectoryWith diskUsage
    recordEntry curPath fs 
    when shouldLog $ logDiffTS st_field

recordEntry :: FilePath -> FileStatus -> DUApp ()
recordEntry fp fs = do
    ext <- asks ext
    when (needRec fp ext $ isRegularFile fs) (addToTS $ fileSize fs)
  where
--    addToTS :: FileOffset -> DUApp ()
    addToTS ofs = modify (\st -> st {st_field = st_field st + ofs})
    needRec _ Nothing _ = True
    needRec fp (Just ext) isFile = isFile && (ext == takeExtension fp)

logDiffTS :: FileOffset -> DUApp ()
logDiffTS ts = do
    AppState {..} <- get
    tell [(curPath, st_field - ts)]