alms-0.6.0: examples/ex28-focusing-and-adoption.alms
(* Demonstrates adoption/focus (Faehnrich and DeLine, 2002). *)
(*
type variables:
`a `b stored value
't 's capability name
*)
let snoc x xs = append xs [x]
let rec revAppN n xs acc =
match n with
| 0 → (acc, xs)
| _ → match xs with
| x ∷ xs → revAppN (n - 1) xs (x ∷ acc)
| xs → (acc, xs)
let swapN ix y xs =
let (x ∷ xs, acc) = revAppN ix xs [] in
(x, revApp acc (y ∷ xs))
abstype 't tr = Tr
and ('t, `a) cap : A = Cap of `a * (unit -A> unit) list
and ('t, `a) guarded =
Guarded of (`a * (unit -A> unit) list) option ref
with
let new (x: `a) : ∃ 't. ('t, `a) cap * 't tr =
(Cap (x, []), Tr)
let swap ((Cap (x, fs), _) : ('t, `a) cap * 't tr) (y : `b)
: ('t, `b) cap * `a =
(Cap (y, fs), x)
let free (Cap (_, fs)) = map (λ f → f ()) fs; ()
let adoptByThen
((Cap adoptee, _) : ('ta, `a) cap * 'ta tr)
((Cap (adoptor, destructors), _) : ('tb, `b) cap * 'tb tr)
(destroy : ('ta, `a) cap -A> unit)
: ('tb, `b) cap * ('tb, `a) guarded =
let r = ref (Some adoptee) in
let g () = match r <- None with
| None → failwith "Can't happen"
| Some c → destroy (Cap c) in
(Cap (adoptor, g ∷ destructors), Guarded r)
let adoptBy
(adoptee : ('ta, `a) cap * 'ta tr)
(adoptor : ('tb, `b) cap * 'tb tr)
: ('tb, `b) cap * ('tb, `a) guarded
= adoptByThen adoptee adoptor (λ (_: ('ta, `a) cap) → ())
let focusIn
((guard, Guarded r) : ('t, `a) cap * ('t, `b) guarded)
(body : (∀ 's. ('s, `b) cap * 's tr -A>
('s, `b) cap * `r))
: ('t, `a) cap * `r =
match r <- None with
| None → failwith "Can't happen"
| Some c →
let (Cap c, result) = body (Cap c, Tr)
in r <- Some c;
(guard, result)
end