open System open System.Windows.Forms let combine (first:IEvent<'Del,'T>) (second:IEvent<'Del,'T>) (lst:'a list) = let event = new Event<'a>() let rec install i = let rec next condition op = if condition then event.Trigger(lst.[op i 1]) f.Dispose() s.Dispose() install (op i 1) and f:IDisposable = first.Subscribe (fun _ -> next (i < lst.Length-1) (+)) and s:IDisposable = second.Subscribe (fun _ -> next (i > 0) (-)) () install 0 event.Publish let frm = new Form(Text="Hello world") let btn = new Button(Text="Button1") let btn1 = new Button(Text="Button2") btn |> frm.Controls.Add btn1 |> frm.Controls.Add btn1.Top <- 100 [1;2;3;4;5] |> combine btn.Click btn1.Click |> Event.add (fun num -> MessageBox.Show (num.ToString()) |> ignore) frm.ShowDialog() |> ignore