--- /dev/null
+
+module Change where
+
+data FileChange = First Change
+ | Second Change
+ | Change Change
+
+data Change = DuplicateFile FilePath
+ | ExtraFile FilePath
+ | ExtraWay String
+ | ExtraThing String
+ | ThingVersionChanged String String String
+ | PermissionsChanged FilePath FilePath String String
+ | FileSizeChanged FilePath FilePath Integer Integer
+
+isSizeChange :: FileChange -> Bool
+isSizeChange (Change (FileSizeChanged {})) = True
+isSizeChange _ = False
+
+pprFileChange :: FileChange -> String
+pprFileChange (First p) = "First " ++ pprChange p
+pprFileChange (Second p) = "Second " ++ pprChange p
+pprFileChange (Change p) = "Change " ++ pprChange p
+
+pprChange :: Change -> String
+pprChange (DuplicateFile fp) = "Duplicate file: " ++ show fp
+pprChange (ExtraFile fp) = "Extra file: " ++ show fp
+pprChange (ExtraWay w) = "Extra way: " ++ show w
+pprChange (ExtraThing t) = "Extra thing: " ++ show t
+pprChange (ThingVersionChanged t v1 v2)
+ = "Version changed for " ++ show t ++ ":\n"
+ ++ " " ++ v1 ++ " -> " ++ v2
+pprChange (PermissionsChanged fp1 fp2 p1 p2)
+ = "Permissions changed:\n"
+ ++ " " ++ show fp1
+ ++ " " ++ show fp2
+ ++ " " ++ p1 ++ " -> " ++ p2
+pprChange (FileSizeChanged fp1 fp2 s1 s2)
+ = "Size changed:\n"
+ ++ " " ++ show fp1 ++ "\n"
+ ++ " " ++ show fp2 ++ "\n"
+ ++ " " ++ show s1 ++ " -> " ++ show s2
+