-- | References to boxed values. module Runtime.Prim.Ref export value allocRef : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj readRef : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj writeRef_ : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj -> Void# import value allocBoxed : [r1 : Region]. Tag# -> Nat# -> Ptr# r1 Obj getBoxed : [r1 r2 : Region]. Ptr# r1 Obj -> Nat# -> Ptr# r2 Obj setBoxed : [r1 r2 : Region]. Ptr# r1 Obj -> Nat# -> Ptr# r2 Obj -> Void# with letrec -- | Allocate a new reference to some boxed value. allocRef [r1 r2: Region] (val: Ptr# r1 Obj): Ptr# r2 Obj = do ref = allocBoxed [r2] (truncate# 0#) 1# setBoxed ref 0# val ref -- | Read the value from a reference. readRef [r1 r2: Region] (ref: Ptr# r1 Obj): Ptr# r2 Obj = getBoxed ref 0# -- | Write a value into reference. writeRef_ [r1 r2: Region] (ref: Ptr# r1 Obj) (val: Ptr# r2 Obj): Void# = setBoxed ref 0# val