@@ -64,13 +64,31 @@ 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 " "
68
+
67
69
68
70
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
73
71
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)))
74
92
75
93
let ( parseMidi : ParserBuilder ) = new ParserBuilder()
76
94
@@ -158,11 +176,14 @@ module ParserMonad =
158
176
work length state ( fun msg -> Error msg) ( fun st ac -> Ok ( ac, st))
159
177
|> Result.map ( fun ( ans , st ) -> ( List.toArray ans, st))
160
178
161
- let boundRepeat n p =
179
+ let inline boundRepeat ( n : ^T ) ( p : ParserMonad < 'a >) : ParserMonad < 'a array > =
162
180
parseMidi {
163
181
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
+ ()
166
187
|]
167
188
}
168
189
0 commit comments