Money_refactored

 avatar
unknown
ocaml
2 months ago
1.6 kB
20
Indexable
module Money : sig
  type t [@@deriving show]
  type currency_symbol [@@deriving show]
  type currency [@@deriving show]

  val make : ?currency:currency -> int -> t
  val add : t -> t -> t
  val multiply : t -> int -> t
  val amount : t -> int
  val equals : t -> t -> bool
end = struct
  type currency_symbol = [ `USD | `EUR ] [@@deriving show]

  type currency = { divisor : int; symbol : currency_symbol; desc : string }
  [@@deriving show]

  type t = { amount : int; currency : currency } [@@deriving show]

  let validate_same_currency t1 t2 =
    if t1.currency.symbol <> t2.currency.symbol then
      failwith "Currencies do not match"

  let compare t1 t2 =
    validate_same_currency t1 t2;
    Int.compare t1.amount t2.amount

  let default_currency =
    { divisor = 100; symbol = `USD; desc = "United States Dollar" }

  let make ?(currency = default_currency) amount = { amount; currency }
  let equals t1 t2 = compare t1 t2 = 0

  let add t1 t2 =
    validate_same_currency t1 t2;
    { t1 with amount = t1.amount + t2.amount }

  let multiply t n = { t with amount = t.amount * n }
  let amount t1 = t1.amount
end

let () =
  let mon = Money.make 10 in
  let mon2 = Money.make 20 in
  let mon3 = Money.add mon mon2 in
  Printf.printf "%d + %d = %s \n" (Money.amount mon) (Money.amount mon2)
    (Money.show mon3);
  let mon3 = Money.multiply mon 2 in
  Printf.printf "%d * 2 = %s\n" (Money.amount mon) (Money.show mon3);
  if Money.equals mon mon2 then
    Printf.printf "%d %d Equal\n" (Money.amount mon) (Money.amount mon2)
  else Printf.printf "%d %d Not Equal\n" (Money.amount mon) (Money.amount mon2)
Editor is loading...
Leave a Comment