Skip to content

Commit 3ae3016

Browse files
redoing boundRepeat
1 parent cbf6486 commit 3ae3016

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

src/ZMidi/Internal/ParserMonad.fs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ 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 ""
67+
let inline mfor (items: #seq<'a>) (fn: 'a -> ParserMonad<'b>) : ParserMonad<seq<'b>> = failwithf ""
6868

6969

7070
type ParserBuilder() =
@@ -74,21 +74,21 @@ module ParserMonad =
7474
member self.Zero () = mzero ()
7575
member self.Combine (ma, mb) = mplus ma mb
7676

77-
7877
// inspired from http://www.fssnip.net/7UJ/title/ResultBuilder-Computational-Expression
7978
// probably broken
8079
member self.TryFinally(m, compensation) =
8180
try self.ReturnFrom(m)
8281
finally compensation()
83-
member self.Delay(f: unit -> _) = f ()
82+
83+
member self.Delay(f: unit -> ParserMonad<'a>) : ParserMonad<'a> = delayM f
8484
member self.Using(res:#System.IDisposable, body) =
8585
self.TryFinally(body res, fun () -> match res with null -> () | disp -> disp.Dispose())
8686
member self.While(guard, f) =
8787
if not (guard()) then self.Zero() else
8888
do f() |> ignore
8989
self.While(guard, f)
9090
member self.For(sequence:seq<_>, body) =
91-
self.Using(sequence.GetEnumerator(), fun enum -> self.While(enum.MoveNext, self.Delay(fun () -> body enum.Current)))
91+
self.Using(sequence.GetEnumerator(), fun enum -> self.While(enum.MoveNext, fun () -> self.Delay(fun () -> body enum.Current)))
9292

9393
let (parseMidi:ParserBuilder) = new ParserBuilder()
9494

@@ -178,13 +178,11 @@ module ParserMonad =
178178

179179
let inline boundRepeat (n: ^T) (p: ParserMonad<'a>) : ParserMonad<'a array> =
180180
parseMidi {
181-
return [|
182-
for i in LanguagePrimitives.GenericZero .. (n - LanguagePrimitives.GenericOne) do
183-
//let! r = p
184-
//yield r
185-
failwith "boundRepeat: not implemented"
186-
()
187-
|]
181+
let l = Array.zeroCreate (int n) // can't use array expression inside a CE (at least as is)
182+
for i in LanguagePrimitives.GenericZero .. (n - LanguagePrimitives.GenericOne) do
183+
let! r = p
184+
l.[i] <- r
185+
return l
188186
}
189187

190188
/// Drop a byte (word8).

0 commit comments

Comments
 (0)