Skip to content

Commit ad6f2c6

Browse files
try out another ParserMonad
1 parent eb81756 commit ad6f2c6

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

src/ZMidi/Read.fs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -407,32 +407,35 @@ module Internal =
407407
type ParserState = {
408408
pos: Pos
409409
running_status: VoiceEvent
410-
input: Span<byte>
410+
input: byte array
411411
}
412412
with
413413
member state.posPastEnd = state.pos >= state.input.Length
414414
member state.moved direction = { state with pos = state.pos + direction }
415415
member state.get () = state.input.[state.pos]
416416

417-
type ErrorMessage = string
417+
type ErrorMessage =
418+
| EOF of where: string
418419
type ParseError = ParseError of Pos * ErrorMessage
419420

420-
type ParserM<'a> = {getParserM : ParserState -> (Result<'a,ParseError> * ParserState)}
421+
type ParserMonad<'a> =
422+
| ParserMonad of (byte [] -> ParserState -> Result<'a, ParseError> * ParserState )
421423

422-
let parserM parse = { getParserM = parse }
423-
424+
425+
//type ParserM<'a> = {getParserM : ParserState -> (Result<'a,ParseError> * ParserState)}
424426
let err pos msg = Error (ParseError(pos, msg))
425427

426-
let getPos = parserM (fun state -> (Ok (state.pos), state))
428+
let parserM parse = ParserMonad parse
429+
let getPos = parserM (fun _ state -> Ok (state.pos), state)
427430

428-
let inline failPastEndOrResult (state: ParserState) funcName getResultAndState =
431+
let inline failPastEndOrResult data (state: ParserState) funcName getResultAndState =
429432
if state.posPastEnd then
430-
(err state.pos (funcName + " - no more data")), state
433+
(err state.pos (EOF funcName)), state
431434
else
432435
let res, state = getResultAndState state
433-
Ok res, state
436+
Ok (res), state
434437

435-
let inline checkedPastEndOrResult fName getResultAndNextState = parserM <| fun state -> failPastEndOrResult state fName getResultAndNextState
438+
let inline checkedPastEndOrResult fName getResultAndNextState = parserM <| fun bytes state -> failPastEndOrResult bytes state fName getResultAndNextState
436439

437440
let peek = checkedPastEndOrResult "peek" (fun state -> state.get(), state)
438441

@@ -453,7 +456,7 @@ module Internal =
453456
fun state -> state.get(), state.moved(1)
454457
)
455458

456-
let word16be : ParserM<word16> =
459+
let word16be : ParserMonad<word16> =
457460
checkedPastEndOrResult "word16be" (
458461
fun state -> failwith "uncons2!!!"
459462
)

0 commit comments

Comments
 (0)