文字列の反転

簡単に書けると楽しい。

[<Test>]
let ``reverse string`` () =
let x = "abcdef"
Assert.AreEqual("fedcba", x |> Array.ofSeq |> Array.rev |> String.Concat)

追記

サロゲートペアのことを考えないといけない。なるほど。

こうなりました。

[<Test>]
let ``reverse string`` () =
let myString = "\uD800\uDC00\u0061\u0300\u00C6"
Assert.AreEqual("𐀀àÆ" , myString)

let sequence = seq {
let tee = StringInfo.GetTextElementEnumerator(myString)
while tee.MoveNext() do
yield
tee.GetTextElement()
}
Assert.AreEqual("Æà𐀀" , sequence |> Array.ofSeq |> Array.rev |> String.Concat)

追記

オブジェクト式を使ったほうがかっこいいかも。

[<Test>]
let ``reverse string`` () =
let myString = "\uD800\uDC00\u0061\u0300\u00C6"
Assert.AreEqual("𐀀àÆ" , myString)
let sequence = { new IEnumerable with
member
x.GetEnumerator() =
StringInfo.GetTextElementEnumerator(myString) :> IEnumerator }
Assert.AreEqual("Æà𐀀" , sequence |> Seq.cast<string> |> Array.ofSeq |> Array.rev |> String.Concat)