{target-dir {product "target"
             novelty (not (mach.core/file-exists? product))
             update! #$ ["mkdir" product]
             clean!  #$ ["rmdir" product]}

 classes-dir {product "target/classes"
              novelty (not (mach.core/file-exists? product))
              depends [target-dir]
              update! #$ ["mkdir" product]
              clean! #$ ["rmdir" product]}

 classes {depends [classes-dir]
          novelty (mach.core/modified-since #ref [classes-dir product] "src")
          update! #$$ ["javac" "-d" #ref [classes-dir product] novelty]
          clean! (when (mach.core/file-exists? #ref [classes-dir product])
                   #$ ["rm" "-rf" (str #ref [classes-dir product] "/*")])}

 sass {dir "sass"}

 css {product "target/app.css"
      depends [target-dir]
      novelty (mach.core/modified-since product #ref [sass dir])
      update! (mach.core/sh (concat ["sassc"] novelty [">" product]))}

 jar {product "target/foo.jar"
      depends [target-dir classes css]
      novelty (concat
               (filter
                (partial mach.core/modified-since? (mach.core/last-modified product))
                #ref [classes product])
               (filter
                (partial mach.core/modified-since? (mach.core/last-modified product))
                #ref [css product]))
      update! (if (mach.core/file-exists? product)
                #$$ ["jar uf" product novelty]
                #$ ["jar cf" product #ref [classes-dir product]])}}
