// Test deep access

type pii is int * int

type ppi is record [x : pii; y : pii]

type ppp is ppi * ppi

function main (const toto : unit) : int is
  block {
    var a : ppp :=
     (record [x = (0,1); y = (10,11)],
      record [x = (100,101); y = (110,111)]);
    a.0.x.0 := 2;
  } with a.0.x.0


function asymetric_tuple_access (const foo : unit) : int is
  block {
    var tuple : int * (int * (int * int)) := (0,(1,(2,3)))
  } with tuple.0 + tuple.1.0 + tuple.1.1.0 + tuple.1.1.1

type nested_record_t is
  record [nesty : record [mymap : map (int, string)]]

function nested_record (var nee : nested_record_t) : string is
  block {
    nee.nesty.mymap[1] := "one"
  } with case nee.nesty.mymap[1] of
           Some (s) -> s
         | None -> (failwith ("Should not happen.") : string)
         end
