Task

Create a directory and any missing parents.

This task is named after the posix mkdir -p command, and several libraries which implement the same behavior.

Please implement a function of a single path string (for example ./path/to/dir) which has the above side-effect.
If the directory already exists, return successfully.
Ideally implementations will work equally well cross-platform (on windows, linux, and OS X).

It's likely that your language implements such a function as part of its standard library. If so, please also show how such a function would be implemented.




#load "unix.cma"
 
let mkdir_p ~path ~perms =
  let ps = String.split_on_char '/' path in
  let rec aux acc = function [] -> ()
  | p::ps ->
      let this = String.concat Filename.dir_sep (List.rev (p::acc)) in
      Unix.mkdir this perms;
      aux (p::acc) ps
  in
  aux [] ps
 
let () =
  mkdir_p "path/to/dir" 0o700