type zipper = { above : string list ; selected : string ; below : string list } let up (zipper : zipper) = match zipper.above with | [] -> zipper | a :: rest -> { above = rest; selected = a; below = zipper.selected :: zipper.below } let down (zipper : zipper) = match zipper.below with | [] -> zipper | a :: rest -> { below = rest; selected = a; above = zipper.selected :: zipper.above } let selected zipper = zipper.selected let to_array zipper = List.concat [ zipper.above; [ zipper.selected ]; zipper.below ] |> Array.of_list