blob: 54e14ea3db2e45b82b00a4c34df8282f3a6b93b1 [file] [log] [blame] [edit]
type World
type R e a = < Error e | Ok a >
type ErrorT = <ErrorEOF | ErrorFull | ErrorEtc U32>
type SOpen
type SError
type FileRead s
fr_open : (World, String) -> R (World, ErrorT) (World, FileRead SOpen)
fr_getc : FileRead SOpen -> R (ErrorT, FileRead SError) (U8, FileRead SOpen)
-- fr_reset : all s. FileRead s -> R (FileRead SError) (FileRead SOpen)
fr_close : all s. FileRead s -> ()
type FileWrite s
fw_open : (World, String) -> R (World, ErrorT) (World, FileWrite SOpen)
fw_putc : (U8, FileWrite SOpen) -> R (ErrorT, FileWrite SError) (FileWrite SOpen)
-- fw_reset : all s. FileWrite s -> R (FileWrite SError) (FileWrite SOpen)
fw_close : all s. FileWrite s -> ()
type DoWhile e a = < Continue e | Done a >
dowhile : all (e,a). (e -> DoWhile e a, e) -> a
copy_byte : (U32, FileRead SOpen, FileWrite SOpen) -> DoWhile (U32, FileRead SOpen, FileWrite SOpen) (R ErrorT U32)
copy_byte (bytes, fr,fw) =
fr_getc fr
| Ok (c,fr) ->
fw_putc (c,fw)
| Ok fw ->
Continue (bytes + 1, fr, fw)
| Error (err,fw) ->
fr_close fr;
fw_close fw;
Done (Error err)
| Error (err,fr) ->
fr_close fr;
fw_close fw;
err
| ErrorEOF -> Done (Ok bytes)
| _ -> Done (Error err)
copy_file : (World,String,String) -> R (World,ErrorT) (World,U32)
copy_file (w,file_in,file_out) =
fr_open (w,file_in)
| Ok (w, fr) ->
fw_open (w,file_out)
| Ok (w, fw) ->
dowhile (copy_byte, (0,fr,fw))
| Ok i -> Ok (w,i)
| Error e -> Error (w, e)
| Error we ->
fr_close fr;
Error we
| Error we ->
Error we