timeItem
    :: NFData b
    => (String -> IO ()) -> String -> (a -> IO b) -> a -> IO b
timeItem logger name f a = do
    startTime <- getCurrentTime
    result <- f a
    _ <- deepseq result (return ()) -- Ensure we include deserialization
    endTime <- getCurrentTime
    let diff = diffUTCTime endTime startTime
    logger $ "Timing: " ++ name ++ " " ++ show diff
    return result
timeItem
    :: NFData b
    => (String -> IO ()) -> String -> (a -> IO b) -> a -> IO b
timeItem logger name f a = do
    startTime <- getCurrentTime
    result <- f a
    _ <- deepseq result (return ()) -- Ensure we include deserialization
    endTime <- getCurrentTime
    let diff = diffUTCTime endTime startTime
    logger $ "Timing: " ++ name ++ " " ++ show diff
    return result
timeItem logger name f a = do
    startTime <- getCurrentTime
    result <- f a
    _ <- deepseq result (return ()) -- Ensure we include deserialization
    endTime <- getCurrentTime
    let diff = diffUTCTime endTime startTime
    logger $ "Timing: " ++ name ++ " " ++ show diff
    return result