type 'a t = { vec: 'a Vec.t; lvls: int Vec.t; } let create() : _ t = {vec=Vec.create(); lvls=Vec.create()} let[@inline] n_levels self : int = Vec.size self.lvls let[@inline] push self x : unit = Vec.push self.vec x let[@inline] push_if_nonzero_level self x : unit = if n_levels self > 0 then ( Vec.push self.vec x; ) let[@inline] push_level (self:_ t) : unit = Vec.push self.lvls (Vec.size self.vec) let pop_levels (self:_ t) (n:int) ~f : unit = if n > n_levels self then ( Error.errorf "Backtrack_stack.pop_levels %d (size: %d)" n (n_levels self); ); if n > 0 then ( let new_lvl = n_levels self - n in let i = Vec.get self.lvls new_lvl in while Vec.size self.vec > i do let x = Vec.pop self.vec in f x done; Vec.shrink self.lvls new_lvl ) let iter ~f self = Vec.iter f self.vec