aboutsummaryrefslogtreecommitdiff
path: root/dataType.ml
blob: 39374655447608617a0a58c4162ebd7d79422268 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
module type COMPARABLE = sig
  type t
  val eq: t -> t -> bool
  val neq: t -> t -> bool
  val lt: t -> t -> bool
  val le: t -> t -> bool
  val gt: t -> t -> bool
  val ge: t -> t -> bool
end

module Comparable = struct

  let eq = (=)
  let neq = (<>)
  let lt = (<)
  let le = (<=)
  let gt = (>)
  let ge = (>=)

end

module Num = struct

  type t =
    | NAN
    | N of Num.num

  let nan = NAN

  let of_num n = N n

  let zero = Num.num_of_int 0

  let to_num = function
    | NAN -> zero
    | N n -> n

  let eq v1 v2 = match v1, v2 with
    | N n1, N n2 -> Num.eq_num n1 n2
    | _, _ -> false

  let neq a b = not (eq a b)

  let lt v1 v2 = match v1, v2 with
    | N n1, N n2 -> Num.lt_num n1 n2
    | N x, NAN -> Num.lt_num x (zero)
    | NAN, N x -> Num.lt_num (zero) x
    | NAN, NAN -> false

  let le v1 v2 = match v1, v2 with
    | N n1, N n2 -> Num.le_num n1 n2
    | N x, NAN -> Num.le_num x (zero)
    | NAN, N x -> Num.le_num (zero) x
    | NAN, NAN -> false

  let gt v1 v2 = match v1, v2 with
    | N n1, N n2 -> Num.gt_num n1 n2
    | N x, NAN -> Num.gt_num x (zero)
    | NAN, N x -> Num.gt_num (zero) x
    | NAN, NAN -> false

  let ge v1 v2 = match v1, v2 with
    | N n1, N n2 -> Num.ge_num n1 n2
    | N x, NAN -> Num.ge_num x (zero)
    | NAN, N x -> Num.ge_num (zero) x
    | NAN, NAN -> false

  let add v1 v2 = match v1, v2 with
    | N n1, N n2 -> N (Num.add_num n1 n2)
    | n1, NAN -> n1
    | NAN, n1 -> n1

  let mult v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.mult_num n1 n2)
   | _, _ -> N zero

  let div v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.div_num n1 n2)
   | _, N _ -> N zero
   | _, _ -> raise Division_by_zero

  let sub v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.sub_num n1 n2)
   | v, NAN -> v
   | NAN, N n -> N (Num.minus_num n)

  let pow v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.power_num n1 n2)
   | _, NAN -> N (Num.num_of_int 1)
   | NAN, _ -> N zero

  let rnd () = N (
    Num.div_num
    (Num.num_of_int @@ Int32.to_int @@ Random.int32 Int32.max_int)
    (Num.num_of_int @@ Int32.to_int @@ Int32.max_int)
  )

  let min v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.min_num n1 n2)
   | NAN, x -> x
   | x, NAN -> x

  let max v1 v2 = match v1, v2 with
   | N n1, N n2 -> N (Num.max_num n1 n2)
   | NAN, x -> x
   | x, NAN -> x

  let abs = function
    | NAN -> NAN
    | N n1 -> N (Num.abs_num n1)

end

module Bool = struct

  type t = bool
  include Comparable

  let true_ = true
  let false_ = false

  let or_ = (||)
  let and_ = (&&)
  let not = Pervasives.not

end

module String = struct

  type t = UTF8.t
  include Comparable

end