content: 
  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
  
  