PLFA agda exercises
{-# OPTIONS --guardedness #-}

module Main where

open import Data.Bool.Base using (true; false)
open import Data.List.Base as List using (_∷_; [])
import Data.List.Sort as Sort
open import Data.String.Base using (_++_; unwords)
import Data.String.Properties as Stringₚ
open import IO
open import Function.Base using (_$_)

open import Relation.Binary.Bundles using (DecTotalOrder)
import Relation.Binary.Construct.On as On

open import System.Directory
open import System.FilePath.Posix

decTotalOrder : DecTotalOrder _ _ _
decTotalOrder =
  On.decTotalOrder Stringₚ.≤-decTotalOrder-≈
                   (getFilePath {n = Nature.relative})

open Sort decTotalOrder using (sort)

main : Main
main = run $ do
  let dirs = "tmp1" ∷ "tmp2" ∷ []
  List.forM′ dirs $ λ d → do
    putStrLn $ "Creating " ++ d
    createDirectory (mkFilePath d)
  ds ← listDirectory (mkFilePath ".")
  List.forM′ (sort ds) $ λ d → do
    true ← doesDirectoryExist d
      where false → pure _
    let str = getFilePath d
    putStrLn $ "Saw " ++ str
  List.forM′ dirs $ λ d → do
    putStrLn $ unwords $ "Removing" ∷ d ∷ []
    removeDirectory (mkFilePath d)