16 lines
484 B
OCaml
16 lines
484 B
OCaml
(* A stack action (pop is run first, then push sequentially) *)
|
|
type 'a t =
|
|
{ pop : int
|
|
; push : 'a list
|
|
}
|
|
|
|
let merge lhs rhs =
|
|
(* merge lhs.push and rhs.pop first *)
|
|
let rec compensate push pop = match (push, pop) with
|
|
| (_, 0) -> (push, pop)
|
|
| ([], _) -> (push, pop)
|
|
| (_::xs, _) -> compensate xs (pop - 1)
|
|
in let (push, pop) = compensate lhs.push rhs.pop in
|
|
{ pop = lhs.pop + pop; push = List.append push rhs.push; }
|
|
|
|
let empty = { pop = 0; push = []; }
|