Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file spin_std.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240includeBasemoduleResult=structincludeBase.ResultmoduleLet_syntax=structlet(let+)=(>>|)let(let*)=(>>=)let(and+)=Let_syntax.Let_syntax.bothendletfold_left~fl=List.fold_leftl~init:(Ok())~f:(funaccel->bindacc~f:(fun()->fel))letfold_right~fl=List.fold_rightl~init:(Ok())~f:(funelacc->bindacc~f:(fun()->fel))end(* Follows Core's API but stripped everything that is POSIX only *)moduleFilename=structincludestructopenCaml.Filenameletcheck_suffix=check_suffixletchop_extension=chop_extensionletchop_suffix=chop_suffixletcurrent_dir_name=current_dir_nameletis_implicit=is_implicitletis_relative=is_relativeletparent_dir_name=parent_dir_nameletdir_sep=dir_sepletquote=quotelettemp_dir_name=get_temp_dir_name()letdirname=dirnameletbasename=basenameendletof_parts=function|[]->failwith"Filename.of_parts: empty parts list"|root::rest->List.foldrest~init:root~f:Caml.Filename.concatletconcat=Caml.Filename.concatendmoduleGlob=GlobmoduleSpin_unix=structopenUnixletmkdir?(perm=0o777)dirname=mkdirdirnamepermletrecmkdir_p?permdir=letmkdir_idempotent?permdir=matchmkdir?permdirwith|()->()(* [mkdir] on MacOSX returns [EISDIR] instead of [EEXIST] if the directory
already exists. *)|exceptionUnix_error((EEXIST|EISDIR),_,_)->()inmatchmkdir_idempotent?permdirwith|()->()|exception(Unix_error(ENOENT,_,_)asexn)->letparent=Filename.dirnamedirinifString.equalparentdirthenraiseexnelse(mkdir_p?permparent;mkdir_idempotent?permdir)letrecrm_ppath=matchCaml.Sys.is_directorypathwith|true->Caml.Sys.readdirpath|>Array.iter~f:(funname->rm_p(Filename.concatpathname));Unix.rmdirpath|false->Caml.Sys.removepathendmoduleSpin_lwt=structincludeLwtletfold_left~fl=letopenSyntaxinlet+l=List.fold_leftl~init:(Lwt.return[])~f:(funaccel->let*acc=accinlet+result=felinresult::acc)inList.revlletfold_right~fl=letopenSyntaxinlet+l=List.fold_rightl~init:(Lwt.return[])~f:(funelacc->let*acc=accinlet+result=felinresult::acc)inList.revlletresult_fold_left~fl=letopenLwt_result.Syntaxinlet+l=List.fold_leftl~init:(Lwt_result.return[])~f:(funaccel->let*acc=accinlet+result=felinresult::acc)inList.revlletresult_fold_right~fl=letopenLwt_result.Syntaxinlet+l=List.fold_rightl~init:(Lwt_result.return[])~f:(funelacc->let*acc=accinlet+result=felinresult::acc)inList.revltypecommand_result={stdout:stringlist;stderr:stringlist;status:Unix.process_status}letcommand_result_of_processprocess=letopenLwt.Syntaxinlet*status=process#statusinlet*stdout=Lwt_io.read_linesprocess#stdout|>Lwt_stream.to_listinlet+stderr=Lwt_io.read_linesprocess#stderr|>Lwt_stream.to_listin{stdout;stderr;status}letprepare_argscmdargs="",Array.of_list(cmd::args)letexeccmdargs=Lwt_process.with_process_full(prepare_argscmdargs)command_result_of_processletexec_with_logscmdargs=letopenLwt.Syntaxinlet*p_output=execcmdargsinlet*_=fold_leftp_output.stdout~f:(funline->Logs_lwt.debug(funm->m"stdout of %s: %s"cmdline))inmatchp_output.statuswith|WEXITED0->let+_=fold_leftp_output.stderr~f:(funline->Logs_lwt.debug(funm->m"stderr of %s: %s"cmdline))inOk()|_->let+_=fold_leftp_output.stderr~f:(funline->Logs_lwt.err(funm->m"stderr of %s: %s"cmdline))inError(Printf.sprintf"The command %s did not run successfully."cmd)letwith_chdir~dirt=letopenLwt.Syntaxinletold_cwd=Caml.Sys.getcwd()inlet*()=Lwt_unix.chdirdirinLwt.finalizet(fun()->Lwt_unix.chdirold_cwd)endmoduleSpin_sys=structincludeSysletrand_digits()=letrand=Random.State.(bits(make_self_init())land0xFFFFFF)inPrintf.sprintf"%06x"randletmk_temp_dir?(mode=0o700)?dirpat=letdir=matchdirwithSomed->d|None->Caml.Filename.get_temp_dir_name()inletraise_errmsg=raise(Sys_errormsg)inletrecloopcount=ifcount<0thenraise_err"mk_temp_dir: too many failing attemps"elseletdir=Printf.sprintf"%s/%s%s"dirpat(rand_digits())intryUnix.mkdirdirmode;dirwith|Unix.Unix_error(Unix.EEXIST,_,_)->loop(count-1)|Unix.Unix_error(Unix.EINTR,_,_)->loopcount|Unix.Unix_error(e,_,_)->raise_err("mk_temp_dir: "^Unix.error_messagee)inloop1000letls_dir?(recursive=true)directory=ifrecursivethenletrecloopresult=function|f::fswhenCaml.Sys.is_directoryf->Caml.Sys.readdirf|>Array.to_list|>List.map~f:(Caml.Filename.concatf)|>List.appendfs|>loopresult|f::fs->loop(f::result)fs|[]->resultinloop[][directory]|>List.revelseCaml.Sys.readdirdirectory|>Array.to_list|>List.map~f:(Caml.Filename.concatdirectory)end