packages feed

alms-0.6.0: examples/ex25-io-type-error.alms

(* Typestate file IO *)

open IO

abstype in_channel' = InChannel of handle with
  let open_in s = InChannel (openFile s ReadMode)
  let input_char (InChannel h) = hGetChar h
  let input_line (InChannel h) = hGetLine h
  let eof_in (InChannel h)     = hIsEOF h
  let close_in (InChannel h)   = hClose h
end

abstype out_channel = OutChannel of handle with
  let open_out s = OutChannel (openFile s WriteMode)
  let output_char (OutChannel h)   = hPutChar h
  let output_string (OutChannel h) = hPutStr h
  let eof_out (OutChannel h)       = hIsEOF h
  let close_out (OutChannel h)     = hClose h
end

abstype in_channel : A = InChannel of in_channel' with
  let a_open_in s = InChannel (open_in s)
  let a_input_char (InChannel rep as ic) =
        (input_char rep, ic)
  let a_input_line (InChannel rep as ic) =
        (input_line rep, ic)
  let a_close_in (InChannel rep) =
        close_in rep
  let a_eof_in (InChannel rep as ic) =
    if eof_in rep
      then close_in rep; None
      else Some ic
end

let cat filename =
  let rec loop ic =
    match a_eof_in ic with
    | None    -> ()
    | Some ic -> let (c, _) = a_input_char ic in
                   putChar c; loop ic
  in loop (a_open_in filename)