@@ -64,7 +64,7 @@ module ParserMonad =
64
64
let inline private delayM ( fn : unit -> ParserMonad < 'a >) : ParserMonad < 'a > =
65
65
bindM ( mreturn ()) fn
66
66
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 " "
68
68
69
69
70
70
type ParserBuilder () =
@@ -74,21 +74,21 @@ module ParserMonad =
74
74
member self.Zero () = mzero ()
75
75
member self.Combine ( ma , mb ) = mplus ma mb
76
76
77
-
78
77
// inspired from http://www.fssnip.net/7UJ/title/ResultBuilder-Computational-Expression
79
78
// probably broken
80
79
member self.TryFinally ( m , compensation ) =
81
80
try self.ReturnFrom( m)
82
81
finally compensation()
83
- member self.Delay ( f : unit -> _ ) = f ()
82
+
83
+ member self.Delay ( f : unit -> ParserMonad < 'a >) : ParserMonad < 'a > = delayM f
84
84
member self.Using ( res : #System.IDisposable , body ) =
85
85
self.TryFinally( body res, fun () -> match res with null -> () | disp -> disp.Dispose())
86
86
member self.While ( guard , f ) =
87
87
if not ( guard()) then self.Zero() else
88
88
do f() |> ignore
89
89
self.While( guard, f)
90
90
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)))
92
92
93
93
let ( parseMidi : ParserBuilder ) = new ParserBuilder()
94
94
@@ -178,13 +178,11 @@ module ParserMonad =
178
178
179
179
let inline boundRepeat ( n : ^T ) ( p : ParserMonad < 'a >) : ParserMonad < 'a array > =
180
180
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
188
186
}
189
187
190
188
/// Drop a byte (word8).
0 commit comments