Skip to content

Commit cbf6486

Browse files
pretending I know what I'm doing for a short lapse
1 parent e708ee0 commit cbf6486

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

src/ZMidi/Internal/ParserMonad.fs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,31 @@ module ParserMonad =
6464
let inline private delayM (fn:unit -> ParserMonad<'a>) : ParserMonad<'a> =
6565
bindM (mreturn ()) fn
6666

67+
let inline mfor (items: #seq<'a>) (fn: unit -> ParserMonad<'a>) : ParserMonad<#seq<'a>> = failwithf ""
68+
6769

6870
type ParserBuilder() =
69-
member self.Return x = mreturn x
70-
member self.Bind (p,f) = bindM p f
71-
member self.Zero () = mzero ()
72-
member self.Combine (ma, mb) = mplus ma mb
7371
member self.ReturnFrom (ma:ParserMonad<'a>) : ParserMonad<'a> = ma
72+
member self.Return x = mreturn x
73+
member self.Bind (p,f) = bindM p f
74+
member self.Zero () = mzero ()
75+
member self.Combine (ma, mb) = mplus ma mb
76+
77+
78+
// inspired from http://www.fssnip.net/7UJ/title/ResultBuilder-Computational-Expression
79+
// probably broken
80+
member self.TryFinally(m, compensation) =
81+
try self.ReturnFrom(m)
82+
finally compensation()
83+
member self.Delay(f: unit -> _) = f ()
84+
member self.Using(res:#System.IDisposable, body) =
85+
self.TryFinally(body res, fun () -> match res with null -> () | disp -> disp.Dispose())
86+
member self.While(guard, f) =
87+
if not (guard()) then self.Zero() else
88+
do f() |> ignore
89+
self.While(guard, f)
90+
member self.For(sequence:seq<_>, body) =
91+
self.Using(sequence.GetEnumerator(), fun enum -> self.While(enum.MoveNext, self.Delay(fun () -> body enum.Current)))
7492

7593
let (parseMidi:ParserBuilder) = new ParserBuilder()
7694

@@ -158,11 +176,14 @@ module ParserMonad =
158176
work length state (fun msg -> Error msg) (fun st ac -> Ok (ac, st))
159177
|> Result.map (fun (ans, st) -> (List.toArray ans, st))
160178

161-
let boundRepeat n p =
179+
let inline boundRepeat (n: ^T) (p: ParserMonad<'a>) : ParserMonad<'a array> =
162180
parseMidi {
163181
return [|
164-
for i in 0 .. (n - 1) do
165-
yield! p
182+
for i in LanguagePrimitives.GenericZero .. (n - LanguagePrimitives.GenericOne) do
183+
//let! r = p
184+
//yield r
185+
failwith "boundRepeat: not implemented"
186+
()
166187
|]
167188
}
168189

src/ZMidi/Read.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ module ReadFile =
9696
}
9797
let messages i =
9898
parseMidi {
99-
return! fatalError (Other "not implemented")
100-
//let! messages = boundRepeat i message
99+
return! boundRepeat i message
101100
}
102101
let track : ParserMonad<MidiTrack> =
103102
parseMidi {
104-
let header = trackHeader
103+
let! length = trackHeader
104+
let! messages = messages length
105105
return! fatalError (Other "not implemented")
106-
// let! messages = messages
106+
107107
}
108108
//let midiFile =
109109
// parseMidi {

0 commit comments

Comments
 (0)