type BankAccount(initialSold : float, Owner : string) =
let TransactHistory : string [] = null
member val Sold = initialSold with get, set
member this.Owner = Owner
member this.DoTransaction(t : TransactionType) =
let transaction = Transaction(this, t)
override this.ToString() =
this.Owner + " has " + this.Sold.ToString() + " $."
type TransactionType =
| Deposit of float
| Withdraw of float
| Transfer of BankAccount * float
type Transaction(hostAccount : BankAccount, transactionType) =
do match transactionType with
| Deposit amount -> hostAccount.Sold <- hostAccount.Sold + amount
| Withdraw amount -> hostAccount.Sold <- hostAccount.Sold - amount
| Transfer (target, amount) -> hostAccount.Sold <- hostAccount.Sold - amount; target.Sold <- target.Sold + amount
dHlwZSBCYW5rQWNjb3VudChpbml0aWFsU29sZCA6IGZsb2F0LCBPd25lciA6IHN0cmluZykgID0gCiAgICBsZXQgVHJhbnNhY3RIaXN0b3J5IDogc3RyaW5nIFtdID0gbnVsbAogICAgbWVtYmVyIHZhbCBTb2xkID0gaW5pdGlhbFNvbGQgd2l0aCBnZXQsIHNldAogICAgbWVtYmVyIHRoaXMuT3duZXIgPSBPd25lcgogICAgbWVtYmVyIHRoaXMuRG9UcmFuc2FjdGlvbih0IDogVHJhbnNhY3Rpb25UeXBlKSA9CiAgICAgICAgIGxldCB0cmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uKHRoaXMsIHQpCiAgICAgICAgCiAgICBvdmVycmlkZSB0aGlzLlRvU3RyaW5nKCkgPSAKICAgICAgICB0aGlzLk93bmVyICsgIiBoYXMgIiArIHRoaXMuU29sZC5Ub1N0cmluZygpICsgIiAkLiIKCnR5cGUgVHJhbnNhY3Rpb25UeXBlID0KfCBEZXBvc2l0IG9mIGZsb2F0CnwgV2l0aGRyYXcgb2YgZmxvYXQKfCBUcmFuc2ZlciBvZiBCYW5rQWNjb3VudCAqIGZsb2F0Cgp0eXBlIFRyYW5zYWN0aW9uKGhvc3RBY2NvdW50IDogQmFua0FjY291bnQsIHRyYW5zYWN0aW9uVHlwZSkgPQogICAgZG8gbWF0Y2ggdHJhbnNhY3Rpb25UeXBlIHdpdGgKICAgICAgICB8IERlcG9zaXQgYW1vdW50IC0+IGhvc3RBY2NvdW50LlNvbGQgPC0gaG9zdEFjY291bnQuU29sZCArIGFtb3VudAogICAgICAgIHwgV2l0aGRyYXcgYW1vdW50IC0+IGhvc3RBY2NvdW50LlNvbGQgPC0gaG9zdEFjY291bnQuU29sZCAtIGFtb3VudAogICAgICAgIHwgVHJhbnNmZXIgKHRhcmdldCwgYW1vdW50KSAtPiBob3N0QWNjb3VudC5Tb2xkIDwtIGhvc3RBY2NvdW50LlNvbGQgLSBhbW91bnQ7IHRhcmdldC5Tb2xkIDwtIHRhcmdldC5Tb2xkICsgYW1vdW50