let s = "hello world"

let n : int = 87

let id x = x

let add x y = x + y

let add' x y =
  let left = x in
  let right = y in
  x + y

let add'' : int -> int -> int = fun x -> fun y -> x + y

let unwrap_option default opt =
  match opt with
  | None -> default
  | Some v -> v

let string_of_bool = function true -> "true" | false -> "false"

let is_a c =
  if c = 'a' then true
  else false

let _ = Printf.printf "%s" "hello"
let () = Printf.printf "%s\n" "world"

let x = ref 0
let _ = x := 1

type my_bool = True | False

type shape = Circle of float | Square of float | Rectangle of (float * float)

type user = {
  login : string;
  password : string;
}

type 'a my_ref = { mutable ref_value : 'a }

let (:=) r v = r.ref_value <- v

let (+) 2 2 = 5

exception Bad_value of string

let bad_value_error () = raise (Bad_value "your value is bad and you should feel bad")

let () =
  try bad_value_error ()
  with Bad_value _ -> ()

let () =
  try bad_value_error ()
  with
  | Bad_value _ -> ()
  | Not_found -> ()

module type FOO = sig
  val foo : 'a -> 'a
end

module Foo : FOO = struct
  let foo x = x
end

let greeter = object
  val greeting = "Hello"
  method greet name = Printf.sprintf "%s, %s!" greeting name 
end

let greeting = greeter#greet "world"

class greeter_factory greeting_text = object (self)
  val greeting = greeting_text
  method greet name = Printf.sprintf "%s, %s!" greeting name
  initializer Printf.printf "Objects will greet the user with \"%s\"\n" greeting
end

let g = new greeter_factory "Hi"