type FizzBuzz = { n: int; s: string } with
member x.gizz = x.update(7, "Gizz")
member x.buzz = x.update(5, "Buzz")
member x.update(m, s) = { x with s = x.s + if x.n % m = 0 then s else "" }
override x.ToString() =
if x.s = "" then string x.n else x.s
let wrap n = { n = n; s = "" }
type System.Int32 with
member x.fizz = wrap(x).update(3, "Fizz")
member x.buzz = wrap(x).update(5, "Buzz")
let p = printfn "%O"
p 1 .fizz.buzz // 1
p 3 .fizz.buzz // Fizz
p 5 .fizz.buzz // Buzz
p 15 .fizz.buzz // FizzBuzz
p 997 .fizz.buzz // 997
p 7 .fizz.buzz.gizz // Gizz
p 21 .fizz.buzz.gizz // FizzGizz
p 35 .fizz.buzz.gizz // BuzzGizz
p 105 .fizz.buzz.gizz // FizzBuzzGizz
p 105 .fizz.gizz.buzz // FizzGizzBuzz
dHlwZSBGaXp6QnV6eiA9IHsgbjogaW50OyBzOiBzdHJpbmcgfSB3aXRoCiAgICBtZW1iZXIgeC5naXp6ID0geC51cGRhdGUoNywgIkdpenoiKQogICAgbWVtYmVyIHguYnV6eiA9IHgudXBkYXRlKDUsICJCdXp6IikKICAgIG1lbWJlciB4LnVwZGF0ZShtLCBzKSA9IHsgeCB3aXRoIHMgPSB4LnMgKyBpZiB4Lm4gJSBtID0gMCB0aGVuIHMgZWxzZSAiIiB9CiAgICBvdmVycmlkZSB4LlRvU3RyaW5nKCkgPQogICAgICAgIGlmIHgucyA9ICIiIHRoZW4gc3RyaW5nIHgubiBlbHNlIHgucwoKbGV0IHdyYXAgbiA9IHsgbiA9IG47IHMgPSAiIiB9Cgp0eXBlIFN5c3RlbS5JbnQzMiB3aXRoCiAgICBtZW1iZXIgeC5maXp6ID0gd3JhcCh4KS51cGRhdGUoMywgIkZpenoiKQogICAgbWVtYmVyIHguYnV6eiA9IHdyYXAoeCkudXBkYXRlKDUsICJCdXp6IikKCmxldCBwID0gcHJpbnRmbiAiJU8iCgpwIDEgLmZpenouYnV6eiAvLyAxCnAgMyAuZml6ei5idXp6IC8vIEZpenoKcCA1IC5maXp6LmJ1enogLy8gQnV6egpwIDE1IC5maXp6LmJ1enogLy8gRml6ekJ1enoKcCA5OTcgLmZpenouYnV6eiAvLyA5OTcKcCA3IC5maXp6LmJ1enouZ2l6eiAvLyBHaXp6CnAgMjEgLmZpenouYnV6ei5naXp6IC8vIEZpenpHaXp6CnAgMzUgLmZpenouYnV6ei5naXp6IC8vIEJ1enpHaXp6CnAgMTA1IC5maXp6LmJ1enouZ2l6eiAvLyBGaXp6QnV6ekdpenoKcCAxMDUgLmZpenouZ2l6ei5idXp6IC8vIEZpenpHaXp6QnV6ego=