type foobar = {
 foo : int,
 bar : int
};

let fb : foobar = {
  foo : 0,
  bar : 0
};

type abc = {
  a : int,
  b : int,
  c : int
};

let abc : abc = {
  a : 42,
  b : 142,
  c : 242
};

let a : int = abc.a;
let b : int = abc.b;
let c : int = abc.c;

let projection = (r: foobar) : int => r.foo + r.bar;

let modify = (r: foobar) : foobar => {foo: 256, bar: r.bar};

let modify_abc = (r: abc) : abc => {...r, b: 2048, c: 42};

type big_record = {
  a : int,
  b : int,
  c : int,
  d : int,
  e : int
};

let br : big_record = {
  a : 23,
  b : 23,
  c : 23,
  d : 23,
  e : 23
};

type double_record = {
  inner : abc,
};

let modify_inner =
  (r: double_record) : double_record => {...r, inner.b : 2048};
