ぼくは思うのだ。 どんなに頭が良くて、りっぱなコードを書けるような人物でも、その人が変な顔で女にもてなかったらずい分と虚しいような気がする。(元ネタ)
async/awaitがあれば、do記法がなくてもこういうコードが書けるようなのだけど、
WhoToFollowWhatever.cs
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Net.Http;
namespace WhoToFollowApp
{
public partial class WhoToFollowWhatever
{
private IList<JToken> users;
private readonly PeopleToFollow display = new PeopleToFollow();
private readonly Random random = new Random();
private readonly HttpClient client = CreateHttpClient();
private static HttpClient CreateHttpClient()
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("User-Agent", "WhoToFollowApp");
return client;
}
public async void RefreshAll(object sender, RefreshEventArgs e)
{
var randomOffset = random.Next(500);
var requestUrl = "https://api.github.com/users?since=" + randomOffset;
var json = await client.GetStringAsync(requestUrl);
users = JArray.Parse(json);
display.Clear();
for (var i = 0; i < 3; i++)
{
display.Add(PickupRandomlyFrom(users));
}
}
public void CloseOne(object sender, CloseEventArgs e)
{
display[e.Index] = PickupRandomlyFrom(users);
}
private PersonToFollow PickupRandomlyFrom(IList<JToken> users)
{
dynamic user = users[random.Next(users.Count)];
return new PersonToFollow
{
Name = (string)user.login,
Url = new Uri((string)user.html_url),
Image = new Uri((string)user.avatar_url)
};
}
public PeopleToFollow SuggestedPeople { get { return display; } }
}
}
このコードと、purescriptで書かれた非同期モナドのコードとで、何か決定的な違いがあるのか、ぼくにはどうしてもわからなかった。(純粋関数型、というのがとでも重要なことらしかったのだけど、それもぼくにはよくわからなかった。)
ただ、このコードはRxスタイルで書いたコードとは意図からして全然違うものに思えるから、このコードでもってリアクティブプログラミングの存在意義を問うことなんてできそうにないことはわかった。
(追記)throttleは確かにちょっと面倒なのだけど、まあそれもこんなクラスを書いてあげれば(別記事を起こした)イベントベース+async/awaitスタイルの中でふつうに扱えるので、これもpurescriptとの違いはよく分からない。