1 (* Copyright (C
) 1999-2007 Henry Cejtin
, Matthew Fluet
, Suresh
2 * Jagannathan
, and Stephen Weeks
.
3 * Copyright (C
) 1997-2000 NEC Research Institute
.
5 * MLton is released under a BSD
-style license
.
6 * See the file MLton
-LICENSE for details
.
9 structure Reader
: READER
=
14 type ('a
, 'b
) reader
= 'b
-> ('a
* 'b
) option
16 fun list (reader
: ('a
, 'b
) reader
): ('a list
, 'b
) reader
=
19 fun loop (state
, accum
) =
21 NONE
=> SOME (rev accum
, state
)
22 |
SOME (a
, state
) => loop (state
, a
:: accum
)
26 fun readerN (reader
: ('a
, 'b
) reader
, n
: int): ('a list
, 'b
) reader
=
29 fun loop (n
, state
, accum
) =
31 then SOME (rev accum
, state
)
32 else case reader state
of
34 |
SOME (x
, state
) => loop (n
- 1, state
, x
:: accum
)
35 in loop (n
, state
, [])
51 fun map (f
: 'a
-> 'c
) (reader
: ('a
, 'b
) reader
): ('c
, 'b
) reader
=
55 |
SOME (a
, b
) => SOME (f a
, b
)
57 fun mapOpt (f
: 'a
-> 'c option
) (reader
: ('a
, 'b
) reader
): ('c
, 'b
) reader
=
64 | SOME c
=> SOME (c
, b
)
67 map (fn [y
, z
] => (y
, z
) | _
=> raise Fail
"Reader.reader2")
72 map (fn [x
, y
, z
] => (x
, y
, z
) | _
=> raise Fail
"Reader.reader3")
76 map (fn [w
, x
, y
, z
] => (w
, x
, y
, z
) | _
=> raise Fail
"Reader.reader4")