summaryrefslogtreecommitdiff
path: root/lib/zipper.ml
diff options
context:
space:
mode:
authorFederico Igne <undyamon@disroot.org>2024-01-26 20:35:57 +0100
committerFederico Igne <undyamon@disroot.org>2024-01-26 20:35:57 +0100
commit1154021614181f2b62ced31cde8b9ac761f91312 (patch)
tree1f0cd0b52e21d0aaf7ebbd6d48d9abeb88cc356e /lib/zipper.ml
parent477dd3d2a9f452d06912f9f56c6eee831a15aead (diff)
downloadsandy-1154021614181f2b62ced31cde8b9ac761f91312.tar.gz
sandy-1154021614181f2b62ced31cde8b9ac761f91312.zip
refactor: make zippers return 'pop'ped elements
Diffstat (limited to 'lib/zipper.ml')
-rw-r--r--lib/zipper.ml9
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/zipper.ml b/lib/zipper.ml
index 413f365..5f3b37a 100644
--- a/lib/zipper.ml
+++ b/lib/zipper.ml
@@ -49,7 +49,9 @@ let goto n z =
49 let step = if n < 0 then left else right in 49 let step = if n < 0 then left else right in
50 Fn.apply_n_times ~n:(abs n) step z 50 Fn.apply_n_times ~n:(abs n) step z
51 51
52let pop ?(n = 1) z = { z with after = Sequence.drop_eagerly z.after n } 52let pop ?(n = 1) z =
53 let a, b = Sequence.split_n z.after n in
54 (Sequence.of_list a, { z with after = b })
53 55
54let pop_before ?(n = 1) = 56let pop_before ?(n = 1) =
55 let rec aux m z = 57 let rec aux m z =
@@ -58,7 +60,10 @@ let pop_before ?(n = 1) =
58 aux 0 60 aux 0
59 61
60let pop_after ?(n = 1) z = 62let pop_after ?(n = 1) z =
61 if right_length z < 2 then z else right z |> pop ~n |> left 63 if right_length z < 2 then (Sequence.empty, z)
64 else
65 let a, b = right z |> pop ~n in
66 (a, left b)
62 67
63let push x z = { z with after = Sequence.shift_right z.after x } 68let push x z = { z with after = Sequence.shift_right z.after x }
64let push_seq s z = { z with after = Sequence.append s z.after } 69let push_seq s z = { z with after = Sequence.append s z.after }