123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219openModule_typesopenCommonmoduletypeSIG=sigtypein_filetypeout_filevalstdin:in_filevalstdout:out_filevalstderr:out_filemoduleM:MONADincludeMONADvalexit:int->'atvalexecute:unitt->unitvalcommand_line:stringarraytvalcurrent_working_directory:stringtvalcli_loop:'a->('a->stringoption)->('a->string->'at)->('a->'at)->'atvalpath_separator:charvalpath_delimiter:charvalread_directory:string->stringarrayoptiontmoduleRead:functor(W:WRITABLE)->sigvalread_buffer:in_file->W.t->W.ttvalread:in_file->W.t->W.ttendmoduleWrite:functor(R:READABLE)->sigvalwrite_buffer:out_file->R.t->R.ttvalwrite:out_file->R.t->R.ttendendmoduleMake(Base:SIG):Io.SIG=structincludeBasemodulePath=structletabsolute(path:string):stringt=letlen=String.lengthpathinif0<len&&path.[0]=path_separatorthenreturnpathelsecurrent_working_directory>>=funcwd->return(iflen=0thencwdelsecwd^String.onepath_separator^path)letsplit(path:string):(string*string)option=Path.splitpath_separatorpathletnormalize(path:string):string=Path.normalizepath_separatorpathletjoin(dir:string)(base:string):string=dir^String.onepath_separator^baseendmoduleProcess=structletexit=exitletexecute=executeletcommand_line=command_lineletcurrent_working_directory=current_working_directoryendmoduleDirectory=structletread=read_directoryend(*let read_file
(path:string) (cannot_open:'a t) (read:in_file -> 'a t)
: 'a t =
open_for_read path >>= fun fd ->
match fd with
| None ->
cannot_open
| Some fd ->
read fd >>= fun a ->
close_in fd >>= fun _ ->
return a
let write_file
(path:string) (cannot_open:'a t) (write:out_file -> 'a t)
: 'a t =
open_for_write path >>= fun fd ->
match fd with
| None ->
cannot_open
| Some fd ->
write fd >>= fun a ->
close_out fd >>= fun _ ->
return a
let create_file
(path:string) (cannot_create:'a t) (write:out_file -> 'a t): 'a t =
create path >>= fun fd ->
match fd with
| None ->
cannot_create
| Some fd ->
write fd >>= fun a ->
close_out fd >>= fun _ ->
return a
*)moduleFile=structmoduleIn=structtypefd=in_fileendmoduleOut=structtypefd=out_fileletsubstring(s:string)(start:int)(len:int)(fd:out_file):unitt=letmoduleW=Write(String_reader)inW.writefd(String_reader.of_substringsstartlen)>>=fun_->return()letstring(s:string)(fd:out_file):unitt=substrings0(String.lengths)fdletputc(c:char)(fd:out_file):unitt=letmoduleW=Write(Char_reader)inW.writefd(Char_reader.makec)>>=fun_->return()letnewline(fd:out_file):unitt=putc'\n'fdletline(s:string)(fd:out_file):unitt=stringsfd>>=fun_->newlinefdletfill(n:int)(c:char)(fd:out_file):unitt=letmoduleW=Write(Fill_reader)inW.writefd(Fill_reader.makenc)>>=fun_->return()endletstdin:In.fd=stdinletstdout:Out.fd=stdoutletstderr:Out.fd=stderrend(*
let getc_in: char option t =
getc stdin
let get_line_in: string option t =
get_line stdin
*)moduleStdout=structopenFileletputc(c:char):unitt=Out.putccstdoutletstring(s:string):unitt=Out.stringsstdoutletline(s:string):unitt=Out.linesstdoutletnewline:unitt=Out.newlinestdoutletfillnc=Out.fillncstdoutendmoduleStderr=structopenFileletputc(c:char):unitt=Out.putccstderrletstring(s:string):unitt=Out.stringsstderrletline(s:string):unitt=Out.linesstderrletnewline:unitt=Out.newlinestderrletfillnc=Out.fillncstderrendend