|
@@ -1,86 +1,10 @@
|
1
|
1
|
module Day7 (
|
2
|
|
- buildTree,
|
3
|
|
- buildTree',
|
4
|
|
- mkdir,
|
5
|
|
- Directory (..),
|
6
|
|
- calculateSize,
|
7
|
|
- filterDirectories,
|
8
|
|
- sumUp,
|
9
|
2
|
day7
|
10
|
3
|
) where
|
11
|
4
|
|
12
|
5
|
import Day7.Parser
|
13
|
|
-import Data.Map (Map)
|
14
|
|
-import qualified Data.Map as Map
|
15
|
|
-
|
16
|
|
-data Directory = Directory
|
17
|
|
- { sub :: Map String Directory
|
18
|
|
- , files :: Map String Int
|
19
|
|
- , isRoot :: Bool
|
20
|
|
-} deriving (Eq)
|
21
|
|
-
|
22
|
|
-
|
23
|
|
-instance Show Directory where
|
24
|
|
- show d = show (files d) ++ " - " ++ show (sub d) ++ "\n"
|
25
|
|
-
|
26
|
|
-mkdir :: Directory
|
27
|
|
-mkdir = Directory { sub = Map.empty, files = Map.empty, isRoot = False }
|
28
|
|
-
|
29
|
|
-rootDirectory :: Directory
|
30
|
|
-rootDirectory = Directory { sub = Map.empty, files = Map.empty, isRoot = True }
|
31
|
|
-
|
32
|
|
-buildTree :: [TerminalCommand] -> Directory
|
33
|
|
-buildTree commands = fst (buildTree' rootDirectory commands)
|
34
|
|
-
|
35
|
|
-buildTree' :: Directory -> [TerminalCommand] -> (Directory, [TerminalCommand])
|
36
|
|
-buildTree' dir [] = (dir, [])
|
37
|
|
-buildTree' dir (command:cs) = case command of
|
38
|
|
- Listing entries ->
|
39
|
|
- let asFiles = Map.fromList $ toFiles entries
|
40
|
|
- newDir = dir { files = asFiles }
|
41
|
|
- in buildTree' newDir cs
|
42
|
|
- In dirName ->
|
43
|
|
- let subFolders = sub dir
|
44
|
|
- selectedDir = Map.findWithDefault mkdir dirName subFolders
|
45
|
|
- (replacement, rest) = buildTree' selectedDir cs
|
46
|
|
- updatedSub = Map.insert dirName replacement subFolders
|
47
|
|
- in buildTree' dir { sub = updatedSub} rest
|
48
|
|
- Out -> (dir, cs)
|
49
|
|
- Root -> if isRoot dir
|
50
|
|
- then buildTree' dir cs
|
51
|
|
- else (dir, command:cs)
|
52
|
|
-
|
53
|
|
-toFiles :: [ListingEntry] -> [(String, Int)]
|
54
|
|
-toFiles ((FileListing name size):rest) = (name, size): toFiles rest
|
55
|
|
-toFiles (_:rest) = toFiles rest
|
56
|
|
-toFiles [] = []
|
57
|
|
-
|
58
|
|
-calculateSize :: Directory -> Int
|
59
|
|
-calculateSize dir = sum (Map.elems (files dir)) + sum sizes
|
60
|
|
- where
|
61
|
|
- subFolders = Map.elems (sub dir)
|
62
|
|
- sizes = map calculateSize subFolders
|
63
|
|
-
|
64
|
|
-flatten :: Directory -> [(String, Directory)]
|
65
|
|
-flatten dir = flatten' ("/", dir)
|
66
|
|
- where
|
67
|
|
- flatten' (name, d) = (name, d) : concatMap flatten' (Map.toList (sub d))
|
68
|
|
-
|
69
|
|
-sizeOfDirectories :: Directory -> [(String, Int)]
|
70
|
|
-sizeOfDirectories dir = map withSize allDirectories
|
71
|
|
- where
|
72
|
|
- allDirectories = flatten dir
|
73
|
|
- withSize (name, directory) = (name, calculateSize directory)
|
74
|
|
-
|
75
|
|
-filterDirectories :: (Int -> Bool) -> Directory -> [(String, Int)]
|
76
|
|
-filterDirectories predicate dir = filter (\(_, size) -> predicate size) $ sizeOfDirectories dir
|
77
|
|
-
|
78
|
|
-sumUp :: [(String, Int)] -> Int
|
79
|
|
-sumUp = sum . map snd
|
80
|
|
-
|
81
|
|
-forceRight :: Either a b -> b
|
82
|
|
-forceRight (Left _) = error "forced Right but got Left"
|
83
|
|
-forceRight (Right b) = b
|
|
6
|
+import Day7.Interpreter
|
|
7
|
+import Shared
|
84
|
8
|
|
85
|
9
|
day7 :: IO ()
|
86
|
10
|
day7 = do
|