type (Ref X) = [
          get = /[/X]
          set = /[X Sig]
]

def ref (#X init:X) : (Ref X) = 
  ( new contents:^X
    run contents!init
    [get = \[res:/X] =
             contents?v = (contents!v | res!v)
     set = \[v:X c:Sig] =
             contents?_ = (contents!v | c![])
    ])

run ( val ref1 = (ref #Int 0)
      val ref2 = (ref #String "one")
      (ref1.set 5);
      (prNL (int.toString (ref1.get)));
      (prNL (ref2.get));
      ()
    )
