Hi,
Another way (not as elegant as kaefer's one) should be using a
Success/Failure Workflow.
Defining the generic success/failure workflow builder
type Attempt<'a> = (unit -> 'a option)
type AttemptBuilder() =
let succeed x = (fun () -> Some(x)) : Attempt<'a>
let fail = (fun () -> None) : Attempt<'a>
let runAttempt (a : Attempt<'a>) = a()
let bind p rest = match runAttempt p with None -> fail | Some r -> (rest r)
let delay f = (fun () -> runAttempt (f()))
member b.Bind(p, rest) = bind p rest
member b.Delay(f) = delay f
member b.Let(p, rest) : Attempt<'a> = rest p
member b.Return(x) = succeed
member b.Zero() = fail
let attempt = new AttemptBuilder()
Building an Attempt value for the PromptResult derived types:
let failIfNotOk (pr : #PromptResult) =
attempt { if pr.Status = PromptStatus.OK then return pr }
Using the workflow in your function.
Assuming doSpecialLeader returns the newly created leader ObjectId, drawLeader returns an ObjectId option (ignored here):
let drawLeader = attempt {
let! entResult = failIfNotOk (ed.GetEntity("Select an entity at leader start point:\n"))
let! pointResult = failIfNotOk (ed.GetPoint("Select insertion point for object text:\n"))
return doSpecialLeader entResult.ObjectId entResult.PickedPoint pointResult.Value }
drawLeader() |> ignore
You can use the first PromptResult values within the workflow:
let drawLeader = attempt {
let! entResult = failIfNotOk (ed.GetEntity("Select an entity at leader start point:\n"))
let opts = new PromptPointOptions("Select insertion point for object text:\n")
opts.UseBasePoint <- true
opts.BasePoint <- entResult .PickedPoint
let! pointResult = failIfNotOk (ed.GetPoint(opts))
return doSpecialLeader entResult.ObjectId entResult.PickedPoint pointResult.Value }
drawLeader() |> ignore