generic_btree/generic_impl/
rope.rs

1extern crate alloc;
2
3use core::ops::RangeBounds;
4use std::assert_eq;
5use std::fmt::Display;
6
7use crate::generic_impl::gap_buffer::MAX_STRING_SIZE;
8use crate::rle::Sliceable;
9use crate::{BTree, BTreeTrait, LeafIndex, LengthFinder, QueryResult};
10
11use super::gap_buffer::GapBuffer;
12use super::len_finder::UseLengthFinder;
13
14#[derive(Debug)]
15struct RopeTrait;
16
17#[derive(Debug)]
18struct Cursor {
19    pos: usize,
20    leaf: LeafIndex,
21}
22
23// TODO: move Rope into a separate project
24#[derive(Debug)]
25pub struct Rope {
26    tree: BTree<RopeTrait>,
27    cursor: Option<Cursor>,
28}
29
30impl UseLengthFinder<RopeTrait> for RopeTrait {
31    #[inline(always)]
32    fn get_len(cache: &<Self as BTreeTrait>::Cache) -> usize {
33        *cache as usize
34    }
35}
36
37impl Rope {
38    #[inline(always)]
39    pub fn len(&self) -> usize {
40        self.tree.root_cache as usize
41    }
42
43    #[inline(always)]
44    pub fn is_empty(&self) -> bool {
45        self.tree.root_cache == 0
46    }
47
48    pub fn insert(&mut self, index: usize, elem: &str) {
49        if index > self.len() {
50            panic!("index {} out of range len={}", index, self.len());
51        }
52
53        if self.is_empty() {
54            for chunk in GapBuffer::from_str(elem) {
55                self.tree.push(chunk);
56            }
57            return;
58        }
59
60        if let Some(Cursor { pos, leaf }) = self.cursor {
61            if pos <= index {
62                let node = self.tree.leaf_nodes.get(leaf.0).unwrap();
63                if index <= pos + node.elem.len() {
64                    let mut success = true;
65                    let offset = index - pos;
66                    let valid = self
67                        .tree
68                        .update_leaf(leaf, |leaf| {
69                            if leaf.len() + elem.len() < MAX_STRING_SIZE {
70                                leaf.insert_bytes(offset, elem.as_bytes()).unwrap();
71                                (true, None, None)
72                            } else {
73                                let mut right = leaf.split(offset);
74                                if leaf.len() + elem.len() < MAX_STRING_SIZE {
75                                    success = leaf.push_bytes(elem.as_bytes()).is_ok();
76                                } else {
77                                    success = right.insert_bytes(0, elem.as_bytes()).is_ok();
78                                }
79
80                                (true, Some(right), None)
81                            }
82                        })
83                        .0;
84
85                    if !valid {
86                        self.cursor = None;
87                    }
88
89                    if success {
90                        return;
91                    }
92                }
93            }
94        }
95
96        let (q, f) = self.tree.query_with_finder_return::<LengthFinder>(&index);
97        self.cursor = q.and_then(|q| {
98            if q.offset() == 0 {
99                if f.slot == 0 || f.parent.is_none() {
100                    None
101                } else {
102                    let node = self.tree.in_nodes.get(f.parent.unwrap()).unwrap();
103                    let child = &node.children[f.slot as usize - 1];
104                    Some(Cursor {
105                        pos: index - child.cache as usize,
106                        leaf: child.arena.unwrap().into(),
107                    })
108                }
109            } else {
110                Some(Cursor {
111                    pos: index - q.offset(),
112                    leaf: q.leaf(),
113                })
114            }
115        });
116
117        self.tree
118            .insert_many_by_cursor(q.map(|x| x.cursor), GapBuffer::from_str(elem));
119    }
120
121    pub fn delete_range(&mut self, range: impl RangeBounds<usize>) {
122        if self.is_empty() {
123            return;
124        }
125
126        let start = match range.start_bound() {
127            core::ops::Bound::Included(x) => *x,
128            core::ops::Bound::Excluded(x) => *x + 1,
129            core::ops::Bound::Unbounded => 0,
130        };
131        let end = match range.end_bound() {
132            core::ops::Bound::Included(&x) => x + 1,
133            core::ops::Bound::Excluded(&x) => x,
134            core::ops::Bound::Unbounded => self.len(),
135        };
136        let end = end.min(self.len());
137        let start = start.min(end);
138        if start == end {
139            return;
140        }
141
142        if let Some(Cursor { pos, leaf }) = self.cursor {
143            if pos <= start {
144                let node = self.tree.leaf_nodes.get(leaf.0).unwrap();
145                if end <= pos + node.elem.len() {
146                    let start_offset = start - pos;
147                    let end_offset = end - pos;
148                    let valid = self
149                        .tree
150                        .update_leaf(leaf, |leaf| {
151                            leaf.delete(start_offset..end_offset);
152                            (true, None, None)
153                        })
154                        .0;
155
156                    if !valid {
157                        self.cursor = None;
158                    }
159
160                    return;
161                }
162            }
163        }
164
165        if end - start == 1 {
166            let q = self
167                .tree
168                .update_leaf_by_search::<LengthFinder>(&start, |leaf, pos| {
169                    leaf.delete(pos.cursor.offset..pos.cursor.offset + 1);
170                    Some((-1, None, None))
171                });
172            self.cursor = q.0.map(|q| Cursor {
173                pos: start - q.offset,
174                leaf: q.leaf,
175            });
176
177            return;
178        }
179
180        self.cursor = None;
181        let from = self.tree.query::<LengthFinder>(&start);
182        let to = self.tree.query::<LengthFinder>(&end);
183        match (from, to) {
184            (Some(from), Some(to)) if from.cursor.leaf == to.cursor.leaf => {
185                let leaf = self.tree.leaf_nodes.get_mut(from.arena()).unwrap();
186                if from.cursor.offset == 0 && to.cursor.offset == leaf.elem.len() {
187                    // delete the whole leaf
188                    self.tree.remove_leaf(from.cursor);
189                } else {
190                    leaf.elem.delete(from.cursor.offset..to.cursor.offset);
191                    self.tree.recursive_update_cache(
192                        from.leaf().into(),
193                        true,
194                        Some(start as isize - end as isize),
195                    );
196                }
197            }
198            _ => {
199                crate::iter::Drain::new(&mut self.tree, from, to);
200            }
201        }
202    }
203
204    fn iter(&self) -> impl Iterator<Item = &GapBuffer> {
205        let mut node_iter = self
206            .tree
207            .first_path()
208            .map(|first| crate::iter::Iter::new(&self.tree, first, self.tree.last_path().unwrap()));
209        std::iter::from_fn(move || match &mut node_iter {
210            Some(node_iter) => {
211                if let Some(node) = node_iter.next() {
212                    Some(&node.1.elem)
213                } else {
214                    None
215                }
216            }
217            None => None,
218        })
219    }
220
221    pub fn slice(&mut self, _range: impl RangeBounds<usize>) {
222        unimplemented!()
223    }
224
225    pub fn new() -> Self {
226        Self {
227            tree: BTree::new(),
228            cursor: None,
229        }
230    }
231
232    #[allow(unused)]
233    fn node_len(&self) -> usize {
234        self.tree.node_len()
235    }
236
237    #[allow(unused)]
238    fn update_in_place(&mut self, pos: usize, new: &str) {
239        todo!()
240    }
241
242    pub fn clear(&mut self) {
243        self.tree.clear();
244    }
245
246    #[allow(unused)]
247    pub fn check(&self) {
248        // dbg!(&self.tree);
249        self.tree.check()
250    }
251
252    pub fn diagnose(&self) {
253        self.tree.diagnose_balance();
254    }
255}
256
257impl Default for Rope {
258    fn default() -> Self {
259        Self::new()
260    }
261}
262
263impl Display for Rope {
264    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
265        let mut ans = Vec::with_capacity(self.len());
266        for elem in self.iter() {
267            let (left, right) = elem.as_bytes();
268            ans.extend_from_slice(left);
269            ans.extend_from_slice(right);
270        }
271
272        f.write_str(std::str::from_utf8(ans.as_slice()).unwrap())
273    }
274}
275
276impl BTreeTrait for RopeTrait {
277    type Elem = GapBuffer;
278    type Cache = isize;
279    type CacheDiff = isize;
280
281    #[inline(always)]
282    fn calc_cache_internal(cache: &mut Self::Cache, caches: &[crate::Child<Self>]) -> isize {
283        let new_cache = caches.iter().map(|x| x.cache).sum::<isize>();
284        let diff = new_cache - *cache;
285        *cache = new_cache;
286        diff
287    }
288
289    #[inline(always)]
290    fn apply_cache_diff(cache: &mut Self::Cache, diff: &Self::CacheDiff) {
291        *cache += *diff;
292    }
293
294    #[inline(always)]
295    fn merge_cache_diff(diff1: &mut Self::CacheDiff, diff2: &Self::CacheDiff) {
296        *diff1 += diff2;
297    }
298
299    #[inline(always)]
300    fn get_elem_cache(elem: &Self::Elem) -> Self::Cache {
301        elem.len() as isize
302    }
303
304    #[inline(always)]
305    fn new_cache_to_diff(cache: &Self::Cache) -> Self::CacheDiff {
306        *cache
307    }
308
309    fn sub_cache(cache_lhs: &Self::Cache, cache_rhs: &Self::Cache) -> Self::CacheDiff {
310        cache_lhs - cache_rhs
311    }
312}
313
314#[allow(unused)]
315fn test_prev_length(rope: &Rope, q: QueryResult) -> usize {
316    let mut count = 0;
317    rope.tree
318        .visit_previous_caches(q.cursor(), |cache| match cache {
319            crate::PreviousCache::NodeCache(cache) => {
320                count += *cache as usize;
321            }
322            crate::PreviousCache::PrevSiblingElem(p) => {
323                count += p.len();
324            }
325            crate::PreviousCache::ThisElemAndOffset { offset, .. } => {
326                count += offset;
327            }
328        });
329    count
330}
331
332#[allow(unused)]
333fn test_index(rope: &Rope) {
334    for index in 0..rope.len() {
335        let q = rope.tree.query::<LengthFinder>(&index).unwrap();
336        let i = test_prev_length(rope, q);
337        assert_eq!(i, index);
338    }
339}
340
341#[cfg(test)]
342mod test {
343
344    use Action::*;
345
346    use crate::HeapVec;
347
348    use super::*;
349
350    #[test]
351    fn test() {
352        let mut rope = Rope::new();
353        rope.insert(0, "123");
354        assert_eq!(rope.len(), 3);
355        rope.insert(1, "x");
356        test_index(&rope);
357        assert_eq!(rope.len(), 4);
358        rope.delete_range(2..4);
359        assert_eq!(&rope.to_string(), "1x");
360        rope.delete_range(..1);
361        assert_eq!(&rope.to_string(), "x");
362        rope.delete_range(..);
363        assert_eq!(&rope.to_string(), "");
364        assert_eq!(rope.len(), 0);
365    }
366
367    #[test]
368    fn test_delete_middle() {
369        let mut rope = Rope::new();
370        rope.insert(0, "135");
371        rope.delete_range(1..2);
372        assert_eq!(&rope.to_string(), "15");
373    }
374
375    #[test]
376    fn test_insert_repeatedly() {
377        let mut rope = Rope::new();
378        rope.insert(0, "123");
379        rope.insert(1, "x");
380        rope.insert(2, "y");
381        rope.insert(3, "z");
382        test_index(&rope);
383        assert_eq!(&rope.to_string(), "1xyz23");
384    }
385
386    #[test]
387    #[ignore]
388    fn test_update() {
389        let mut rope = Rope::new();
390        rope.insert(0, "123");
391        rope.insert(3, "xyz");
392        rope.update_in_place(1, "kkkk");
393        assert_eq!(&rope.to_string(), "1kkkkz");
394    }
395
396    #[test]
397    fn test_clear() {
398        let mut rope = Rope::new();
399        rope.insert(0, "123");
400        assert_eq!(rope.len(), 3);
401        rope.clear();
402        assert_eq!(rope.len(), 0);
403        assert_eq!(&rope.to_string(), "");
404        rope.insert(0, "kkk");
405        assert_eq!(&rope.to_string(), "kkk");
406    }
407
408    #[test]
409    fn test_insert_many() {
410        let mut rope = Rope::new();
411        let s = "_12345678_".repeat(10);
412        let mut expected = String::new();
413        for i in 0..100 {
414            expected.insert_str(i, &s);
415            rope.insert(i, &s);
416            assert_eq!(&rope.to_string(), &expected)
417        }
418    }
419
420    #[test]
421    fn test_repeat_insert() {
422        let mut rope = Rope::new();
423        rope.insert(0, "123");
424        for _ in 0..10000 {
425            rope.insert(rope.len() / 2, "k");
426        }
427    }
428
429    #[test]
430    #[ignore]
431    fn test_update_1() {
432        let mut rope = Rope::new();
433        for i in 0..100 {
434            rope.insert(i, &(i % 10).to_string());
435        }
436
437        rope.update_in_place(15, "kkkkk");
438        assert_eq!(&rope.to_string()[10..20], "01234kkkkk");
439        test_index(&rope);
440    }
441
442    #[derive(Debug)]
443    enum Action {
444        Insert { pos: u8, content: u8 },
445        Delete { pos: u8, len: u8 },
446    }
447
448    fn fuzz(data: HeapVec<Action>) {
449        let mut rope = Rope::new();
450        let mut truth = String::new();
451        for action in data {
452            match action {
453                Action::Insert { pos, content } => {
454                    let pos = pos as usize % (truth.len() + 1);
455                    let s = content.to_string();
456                    dbg!("INS", pos, &s);
457                    dbg!(&rope);
458                    truth.insert_str(pos, &s);
459                    rope.insert(pos, &s);
460                    dbg!(&rope);
461                    rope.check();
462                    assert_eq!(rope.len(), truth.len());
463                    assert_eq!(rope.to_string(), truth, "{:#?}", &rope.tree);
464                }
465                Action::Delete { pos, len } => {
466                    let pos = pos as usize % (truth.len() + 1);
467                    let mut len = len as usize % 10;
468                    len = len.min(truth.len() - pos);
469                    dbg!("DEL", pos, len);
470                    dbg!(&rope);
471                    rope.delete_range(pos..(pos + len));
472                    dbg!(&rope);
473                    truth.drain(pos..pos + len);
474                    rope.check();
475                    assert_eq!(rope.len(), truth.len());
476                    assert_eq!(rope.to_string(), truth, "{:#?}", &rope.tree);
477                }
478            }
479        }
480
481        assert_eq!(rope.to_string(), truth);
482    }
483
484    #[test]
485    fn fuzz_0() {
486        fuzz(vec![
487            Insert {
488                pos: 0,
489                content: 128,
490            },
491            Insert {
492                pos: 0,
493                content: 249,
494            },
495            Insert {
496                pos: 108,
497                content: 108,
498            },
499            Delete { pos: 192, len: 193 },
500            Insert {
501                pos: 106,
502                content: 108,
503            },
504            Insert {
505                pos: 108,
506                content: 108,
507            },
508            Insert {
509                pos: 100,
510                content: 108,
511            },
512            Insert {
513                pos: 108,
514                content: 108,
515            },
516            Insert {
517                pos: 108,
518                content: 108,
519            },
520            Insert {
521                pos: 108,
522                content: 108,
523            },
524            Insert { pos: 0, content: 8 },
525            Insert {
526                pos: 108,
527                content: 108,
528            },
529            Insert {
530                pos: 108,
531                content: 108,
532            },
533            Insert {
534                pos: 111,
535                content: 127,
536            },
537            Delete { pos: 255, len: 255 },
538            Delete { pos: 255, len: 36 },
539            Delete { pos: 255, len: 255 },
540            Delete { pos: 255, len: 255 },
541            Delete { pos: 255, len: 255 },
542            Delete { pos: 135, len: 169 },
543            Delete { pos: 255, len: 255 },
544            Delete { pos: 255, len: 255 },
545            Delete { pos: 255, len: 255 },
546            Delete { pos: 255, len: 255 },
547        ])
548    }
549
550    #[test]
551    fn fuzz_1() {
552        fuzz(vec![
553            Insert {
554                pos: 157,
555                content: 108,
556            },
557            Insert {
558                pos: 255,
559                content: 255,
560            },
561            Insert {
562                pos: 108,
563                content: 108,
564            },
565            Insert {
566                pos: 108,
567                content: 108,
568            },
569            Insert {
570                pos: 8,
571                content: 101,
572            },
573            Insert {
574                pos: 111,
575                content: 127,
576            },
577            Delete { pos: 255, len: 169 },
578        ])
579    }
580
581    #[test]
582    fn fuzz_2() {
583        fuzz(vec![
584            Insert {
585                pos: 0,
586                content: 128,
587            },
588            Insert {
589                pos: 0,
590                content: 249,
591            },
592            Insert {
593                pos: 108,
594                content: 108,
595            },
596            Insert {
597                pos: 108,
598                content: 108,
599            },
600            Insert {
601                pos: 108,
602                content: 108,
603            },
604            Insert {
605                pos: 108,
606                content: 108,
607            },
608            Insert {
609                pos: 108,
610                content: 108,
611            },
612            Insert {
613                pos: 108,
614                content: 108,
615            },
616            Insert {
617                pos: 108,
618                content: 0,
619            },
620            Insert {
621                pos: 108,
622                content: 108,
623            },
624            Insert {
625                pos: 108,
626                content: 249,
627            },
628            Insert {
629                pos: 135,
630                content: 255,
631            },
632            Delete { pos: 255, len: 255 },
633            Delete { pos: 169, len: 169 },
634        ])
635    }
636
637    #[test]
638    fn fuzz_3() {
639        fuzz(vec![
640            Insert {
641                pos: 111,
642                content: 140,
643            },
644            Insert {
645                pos: 111,
646                content: 107,
647            },
648            Insert {
649                pos: 35,
650                content: 102,
651            },
652            Insert {
653                pos: 102,
654                content: 102,
655            },
656            Insert {
657                pos: 102,
658                content: 102,
659            },
660            Insert {
661                pos: 102,
662                content: 102,
663            },
664            Insert {
665                pos: 64,
666                content: 64,
667            },
668            Insert {
669                pos: 64,
670                content: 64,
671            },
672            Insert {
673                pos: 64,
674                content: 64,
675            },
676            Insert {
677                pos: 64,
678                content: 0,
679            },
680            Insert {
681                pos: 64,
682                content: 64,
683            },
684            Insert {
685                pos: 93,
686                content: 93,
687            },
688            Insert {
689                pos: 93,
690                content: 93,
691            },
692            Insert {
693                pos: 93,
694                content: 93,
695            },
696            Insert {
697                pos: 93,
698                content: 93,
699            },
700            Insert {
701                pos: 93,
702                content: 93,
703            },
704            Insert {
705                pos: 93,
706                content: 93,
707            },
708            Insert {
709                pos: 93,
710                content: 93,
711            },
712            Insert {
713                pos: 93,
714                content: 93,
715            },
716            Insert {
717                pos: 93,
718                content: 93,
719            },
720            Insert {
721                pos: 93,
722                content: 93,
723            },
724            Insert {
725                pos: 93,
726                content: 93,
727            },
728            Insert {
729                pos: 93,
730                content: 93,
731            },
732            Insert {
733                pos: 93,
734                content: 93,
735            },
736            Insert {
737                pos: 93,
738                content: 93,
739            },
740            Insert {
741                pos: 93,
742                content: 93,
743            },
744            Insert {
745                pos: 64,
746                content: 64,
747            },
748            Insert {
749                pos: 64,
750                content: 64,
751            },
752            Insert {
753                pos: 64,
754                content: 64,
755            },
756            Insert {
757                pos: 102,
758                content: 119,
759            },
760            Insert {
761                pos: 119,
762                content: 119,
763            },
764            Insert {
765                pos: 119,
766                content: 119,
767            },
768            Insert {
769                pos: 119,
770                content: 119,
771            },
772            Insert {
773                pos: 119,
774                content: 119,
775            },
776            Insert {
777                pos: 119,
778                content: 111,
779            },
780            Insert {
781                pos: 102,
782                content: 102,
783            },
784            Insert {
785                pos: 102,
786                content: 101,
787            },
788            Insert {
789                pos: 36,
790                content: 146,
791            },
792            Delete { pos: 74, len: 102 },
793            Insert {
794                pos: 119,
795                content: 119,
796            },
797            Insert {
798                pos: 119,
799                content: 119,
800            },
801            Insert {
802                pos: 17,
803                content: 17,
804            },
805            Insert {
806                pos: 17,
807                content: 17,
808            },
809            Insert {
810                pos: 64,
811                content: 64,
812            },
813            Insert {
814                pos: 64,
815                content: 64,
816            },
817            Insert {
818                pos: 64,
819                content: 64,
820            },
821            Insert {
822                pos: 64,
823                content: 64,
824            },
825            Insert {
826                pos: 64,
827                content: 64,
828            },
829            Insert {
830                pos: 64,
831                content: 64,
832            },
833            Insert {
834                pos: 64,
835                content: 64,
836            },
837            Insert { pos: 0, content: 0 },
838            Insert {
839                pos: 102,
840                content: 119,
841            },
842            Insert {
843                pos: 119,
844                content: 119,
845            },
846            Insert {
847                pos: 119,
848                content: 119,
849            },
850            Insert {
851                pos: 119,
852                content: 119,
853            },
854            Insert {
855                pos: 119,
856                content: 119,
857            },
858            Insert {
859                pos: 119,
860                content: 111,
861            },
862            Insert {
863                pos: 102,
864                content: 102,
865            },
866            Insert { pos: 0, content: 0 },
867            Insert {
868                pos: 3,
869                content: 73,
870            },
871            Insert {
872                pos: 146,
873                content: 74,
874            },
875            Insert {
876                pos: 119,
877                content: 119,
878            },
879            Insert {
880                pos: 119,
881                content: 119,
882            },
883            Insert {
884                pos: 119,
885                content: 119,
886            },
887            Insert {
888                pos: 119,
889                content: 119,
890            },
891            Insert {
892                pos: 21,
893                content: 119,
894            },
895            Insert {
896                pos: 119,
897                content: 119,
898            },
899            Insert {
900                pos: 119,
901                content: 119,
902            },
903            Insert {
904                pos: 111,
905                content: 111,
906            },
907            Insert { pos: 0, content: 8 },
908            Insert {
909                pos: 102,
910                content: 102,
911            },
912            Insert {
913                pos: 102,
914                content: 102,
915            },
916            Insert {
917                pos: 102,
918                content: 3,
919            },
920            Insert {
921                pos: 36,
922                content: 146,
923            },
924            Insert {
925                pos: 119,
926                content: 119,
927            },
928            Delete { pos: 111, len: 119 },
929            Insert {
930                pos: 119,
931                content: 119,
932            },
933            Insert {
934                pos: 102,
935                content: 102,
936            },
937            Insert {
938                pos: 102,
939                content: 102,
940            },
941            Insert {
942                pos: 73,
943                content: 36,
944            },
945            Delete { pos: 74, len: 102 },
946            Delete { pos: 255, len: 255 },
947            Insert {
948                pos: 42,
949                content: 64,
950            },
951            Insert {
952                pos: 64,
953                content: 64,
954            },
955            Insert {
956                pos: 64,
957                content: 64,
958            },
959            Insert {
960                pos: 64,
961                content: 64,
962            },
963            Insert {
964                pos: 102,
965                content: 102,
966            },
967            Insert {
968                pos: 119,
969                content: 119,
970            },
971            Insert {
972                pos: 42,
973                content: 42,
974            },
975            Insert {
976                pos: 42,
977                content: 42,
978            },
979            Insert {
980                pos: 42,
981                content: 42,
982            },
983            Insert {
984                pos: 0,
985                content: 15,
986            },
987            Insert {
988                pos: 42,
989                content: 42,
990            },
991            Insert {
992                pos: 42,
993                content: 42,
994            },
995            Insert {
996                pos: 42,
997                content: 42,
998            },
999            Insert {
1000                pos: 42,
1001                content: 42,
1002            },
1003            Insert {
1004                pos: 42,
1005                content: 42,
1006            },
1007            Insert {
1008                pos: 42,
1009                content: 42,
1010            },
1011            Insert {
1012                pos: 42,
1013                content: 42,
1014            },
1015            Insert {
1016                pos: 42,
1017                content: 42,
1018            },
1019            Insert {
1020                pos: 42,
1021                content: 42,
1022            },
1023            Insert {
1024                pos: 119,
1025                content: 119,
1026            },
1027            Insert {
1028                pos: 102,
1029                content: 102,
1030            },
1031            Insert {
1032                pos: 102,
1033                content: 102,
1034            },
1035            Insert {
1036                pos: 102,
1037                content: 3,
1038            },
1039            Insert {
1040                pos: 36,
1041                content: 146,
1042            },
1043            Insert {
1044                pos: 255,
1045                content: 255,
1046            },
1047            Insert {
1048                pos: 42,
1049                content: 42,
1050            },
1051            Insert {
1052                pos: 64,
1053                content: 64,
1054            },
1055            Insert {
1056                pos: 64,
1057                content: 64,
1058            },
1059            Insert {
1060                pos: 64,
1061                content: 64,
1062            },
1063            Insert {
1064                pos: 64,
1065                content: 64,
1066            },
1067            Insert {
1068                pos: 119,
1069                content: 119,
1070            },
1071            Insert {
1072                pos: 119,
1073                content: 119,
1074            },
1075            Insert {
1076                pos: 42,
1077                content: 42,
1078            },
1079            Insert {
1080                pos: 42,
1081                content: 38,
1082            },
1083            Insert { pos: 0, content: 0 },
1084            Insert {
1085                pos: 89,
1086                content: 89,
1087            },
1088            Insert {
1089                pos: 89,
1090                content: 89,
1091            },
1092            Insert {
1093                pos: 89,
1094                content: 89,
1095            },
1096            Insert {
1097                pos: 89,
1098                content: 89,
1099            },
1100            Insert {
1101                pos: 89,
1102                content: 89,
1103            },
1104            Insert {
1105                pos: 89,
1106                content: 89,
1107            },
1108            Insert {
1109                pos: 89,
1110                content: 89,
1111            },
1112            Insert {
1113                pos: 89,
1114                content: 89,
1115            },
1116            Insert {
1117                pos: 89,
1118                content: 89,
1119            },
1120            Insert {
1121                pos: 89,
1122                content: 89,
1123            },
1124            Insert {
1125                pos: 89,
1126                content: 89,
1127            },
1128            Insert {
1129                pos: 89,
1130                content: 89,
1131            },
1132            Insert {
1133                pos: 89,
1134                content: 89,
1135            },
1136            Insert {
1137                pos: 89,
1138                content: 89,
1139            },
1140            Insert {
1141                pos: 89,
1142                content: 89,
1143            },
1144            Insert {
1145                pos: 89,
1146                content: 89,
1147            },
1148            Insert {
1149                pos: 42,
1150                content: 42,
1151            },
1152            Insert {
1153                pos: 42,
1154                content: 42,
1155            },
1156            Insert {
1157                pos: 42,
1158                content: 42,
1159            },
1160            Insert {
1161                pos: 42,
1162                content: 42,
1163            },
1164            Insert {
1165                pos: 42,
1166                content: 42,
1167            },
1168            Insert {
1169                pos: 119,
1170                content: 119,
1171            },
1172            Insert {
1173                pos: 119,
1174                content: 37,
1175            },
1176            Insert {
1177                pos: 101,
1178                content: 102,
1179            },
1180            Insert { pos: 0, content: 0 },
1181            Delete { pos: 193, len: 63 },
1182            Insert {
1183                pos: 108,
1184                content: 108,
1185            },
1186            Insert {
1187                pos: 108,
1188                content: 0,
1189            },
1190            Insert {
1191                pos: 108,
1192                content: 108,
1193            },
1194            Insert {
1195                pos: 108,
1196                content: 108,
1197            },
1198            Insert {
1199                pos: 108,
1200                content: 108,
1201            },
1202            Insert { pos: 0, content: 8 },
1203            Insert {
1204                pos: 108,
1205                content: 108,
1206            },
1207            Insert {
1208                pos: 102,
1209                content: 102,
1210            },
1211            Insert {
1212                pos: 119,
1213                content: 119,
1214            },
1215            Insert {
1216                pos: 119,
1217                content: 119,
1218            },
1219            Insert {
1220                pos: 119,
1221                content: 119,
1222            },
1223            Insert {
1224                pos: 119,
1225                content: 119,
1226            },
1227            Delete { pos: 199, len: 199 },
1228            Delete { pos: 199, len: 199 },
1229            Delete { pos: 199, len: 199 },
1230            Delete { pos: 199, len: 199 },
1231            Delete { pos: 199, len: 199 },
1232            Delete { pos: 199, len: 187 },
1233            Delete { pos: 187, len: 187 },
1234            Delete { pos: 187, len: 187 },
1235            Delete { pos: 187, len: 187 },
1236            Delete { pos: 187, len: 187 },
1237            Delete { pos: 187, len: 187 },
1238            Delete { pos: 187, len: 187 },
1239            Delete { pos: 187, len: 187 },
1240            Delete { pos: 187, len: 187 },
1241            Insert {
1242                pos: 3,
1243                content: 119,
1244            },
1245            Insert {
1246                pos: 102,
1247                content: 102,
1248            },
1249            Delete { pos: 163, len: 163 },
1250            Delete { pos: 163, len: 163 },
1251            Delete { pos: 163, len: 102 },
1252            Insert {
1253                pos: 102,
1254                content: 102,
1255            },
1256            Insert {
1257                pos: 108,
1258                content: 249,
1259            },
1260            Insert {
1261                pos: 135,
1262                content: 169,
1263            },
1264            Delete { pos: 255, len: 255 },
1265            Delete { pos: 255, len: 255 },
1266            Delete { pos: 111, len: 255 },
1267            Insert {
1268                pos: 111,
1269                content: 111,
1270            },
1271            Insert {
1272                pos: 255,
1273                content: 255,
1274            },
1275        ])
1276    }
1277
1278    #[test]
1279    fn fuzz_4() {
1280        fuzz(vec![
1281            Insert {
1282                pos: 0,
1283                content: 128,
1284            },
1285            Insert {
1286                pos: 0,
1287                content: 249,
1288            },
1289            Insert { pos: 8, content: 0 },
1290            Insert {
1291                pos: 108,
1292                content: 108,
1293            },
1294            Insert {
1295                pos: 108,
1296                content: 108,
1297            },
1298            Insert {
1299                pos: 108,
1300                content: 108,
1301            },
1302            Insert {
1303                pos: 108,
1304                content: 108,
1305            },
1306            Insert {
1307                pos: 108,
1308                content: 108,
1309            },
1310            Insert {
1311                pos: 108,
1312                content: 0,
1313            },
1314            Insert {
1315                pos: 108,
1316                content: 108,
1317            },
1318        ])
1319    }
1320
1321    #[test]
1322    fn fuzz_5() {
1323        fuzz(vec![
1324            Insert {
1325                pos: 123,
1326                content: 123,
1327            },
1328            Insert {
1329                pos: 123,
1330                content: 123,
1331            },
1332            Insert {
1333                pos: 123,
1334                content: 123,
1335            },
1336            Insert {
1337                pos: 0,
1338                content: 123,
1339            },
1340            Delete { pos: 108, len: 108 },
1341            Insert {
1342                pos: 108,
1343                content: 108,
1344            },
1345            Insert {
1346                pos: 108,
1347                content: 108,
1348            },
1349            Insert {
1350                pos: 108,
1351                content: 108,
1352            },
1353            Insert {
1354                pos: 108,
1355                content: 108,
1356            },
1357            Insert {
1358                pos: 12,
1359                content: 0,
1360            },
1361            Insert { pos: 0, content: 0 },
1362            Insert {
1363                pos: 127,
1364                content: 135,
1365            },
1366            Delete { pos: 255, len: 246 },
1367            Delete { pos: 246, len: 246 },
1368            Delete { pos: 246, len: 246 },
1369            Delete { pos: 246, len: 246 },
1370            Insert {
1371                pos: 101,
1372                content: 101,
1373            },
1374            Insert {
1375                pos: 101,
1376                content: 101,
1377            },
1378            Delete { pos: 255, len: 255 },
1379            Delete { pos: 169, len: 169 },
1380        ])
1381    }
1382
1383    #[test]
1384    fn fuzz_6() {
1385        fuzz(vec![
1386            Insert {
1387                pos: 0,
1388                content: 128,
1389            },
1390            Insert { pos: 0, content: 0 },
1391            Insert {
1392                pos: 108,
1393                content: 108,
1394            },
1395            Insert {
1396                pos: 108,
1397                content: 108,
1398            },
1399            Insert {
1400                pos: 108,
1401                content: 108,
1402            },
1403            Insert {
1404                pos: 108,
1405                content: 108,
1406            },
1407            Insert {
1408                pos: 108,
1409                content: 108,
1410            },
1411            Insert {
1412                pos: 0,
1413                content: 249,
1414            },
1415            Insert {
1416                pos: 108,
1417                content: 108,
1418            },
1419            Insert {
1420                pos: 108,
1421                content: 108,
1422            },
1423            Insert {
1424                pos: 108,
1425                content: 108,
1426            },
1427            Insert {
1428                pos: 108,
1429                content: 108,
1430            },
1431            Insert {
1432                pos: 171,
1433                content: 171,
1434            },
1435            Delete { pos: 171, len: 0 },
1436            Insert {
1437                pos: 108,
1438                content: 108,
1439            },
1440            Insert {
1441                pos: 108,
1442                content: 108,
1443            },
1444            Insert {
1445                pos: 108,
1446                content: 108,
1447            },
1448            Insert {
1449                pos: 108,
1450                content: 108,
1451            },
1452            Insert {
1453                pos: 108,
1454                content: 171,
1455            },
1456            Delete { pos: 187, len: 171 },
1457            Delete { pos: 171, len: 171 },
1458            Delete { pos: 171, len: 171 },
1459            Delete { pos: 171, len: 171 },
1460            Delete { pos: 171, len: 171 },
1461            Insert {
1462                pos: 108,
1463                content: 108,
1464            },
1465            Insert {
1466                pos: 108,
1467                content: 108,
1468            },
1469            Insert {
1470                pos: 108,
1471                content: 108,
1472            },
1473            Insert {
1474                pos: 108,
1475                content: 108,
1476            },
1477            Insert {
1478                pos: 171,
1479                content: 171,
1480            },
1481            Insert { pos: 0, content: 0 },
1482            Insert {
1483                pos: 108,
1484                content: 108,
1485            },
1486            Insert {
1487                pos: 108,
1488                content: 108,
1489            },
1490            Insert {
1491                pos: 110,
1492                content: 108,
1493            },
1494            Insert {
1495                pos: 108,
1496                content: 108,
1497            },
1498            Insert {
1499                pos: 108,
1500                content: 171,
1501            },
1502            Delete { pos: 187, len: 171 },
1503            Delete { pos: 171, len: 171 },
1504            Delete { pos: 171, len: 171 },
1505            Delete { pos: 171, len: 171 },
1506            Delete { pos: 171, len: 171 },
1507            Delete { pos: 171, len: 171 },
1508            Delete { pos: 171, len: 171 },
1509            Delete { pos: 171, len: 171 },
1510            Insert {
1511                pos: 8,
1512                content: 108,
1513            },
1514            Insert {
1515                pos: 108,
1516                content: 108,
1517            },
1518            Insert {
1519                pos: 50,
1520                content: 108,
1521            },
1522            Delete { pos: 108, len: 108 },
1523            Insert {
1524                pos: 108,
1525                content: 87,
1526            },
1527            Insert {
1528                pos: 249,
1529                content: 1,
1530            },
1531            Delete { pos: 169, len: 235 },
1532            Delete { pos: 171, len: 171 },
1533            Delete { pos: 171, len: 171 },
1534            Delete { pos: 163, len: 171 },
1535            Delete { pos: 171, len: 171 },
1536            Insert { pos: 8, content: 0 },
1537            Insert { pos: 0, content: 0 },
1538            Delete { pos: 171, len: 171 },
1539            Delete { pos: 171, len: 171 },
1540            Delete { pos: 41, len: 164 },
1541            Delete { pos: 171, len: 171 },
1542            Delete { pos: 171, len: 171 },
1543            Delete { pos: 171, len: 171 },
1544            Delete { pos: 171, len: 171 },
1545            Delete { pos: 171, len: 171 },
1546            Delete { pos: 171, len: 171 },
1547            Delete { pos: 171, len: 171 },
1548            Delete { pos: 171, len: 171 },
1549            Insert { pos: 0, content: 0 },
1550            Insert {
1551                pos: 108,
1552                content: 108,
1553            },
1554            Insert {
1555                pos: 108,
1556                content: 108,
1557            },
1558            Delete { pos: 171, len: 171 },
1559            Delete { pos: 171, len: 171 },
1560            Insert {
1561                pos: 123,
1562                content: 123,
1563            },
1564            Insert {
1565                pos: 123,
1566                content: 123,
1567            },
1568            Insert {
1569                pos: 123,
1570                content: 2,
1571            },
1572            Insert {
1573                pos: 254,
1574                content: 123,
1575            },
1576            Insert {
1577                pos: 123,
1578                content: 123,
1579            },
1580            Insert {
1581                pos: 123,
1582                content: 123,
1583            },
1584            Insert {
1585                pos: 123,
1586                content: 123,
1587            },
1588            Insert {
1589                pos: 0,
1590                content: 123,
1591            },
1592            Delete { pos: 238, len: 238 },
1593            Delete { pos: 238, len: 238 },
1594            Delete { pos: 238, len: 238 },
1595            Delete { pos: 238, len: 238 },
1596            Delete { pos: 238, len: 238 },
1597            Delete { pos: 238, len: 238 },
1598            Delete { pos: 238, len: 238 },
1599            Delete { pos: 238, len: 238 },
1600            Insert {
1601                pos: 238,
1602                content: 238,
1603            },
1604            Delete { pos: 238, len: 238 },
1605            Delete { pos: 238, len: 238 },
1606            Insert { pos: 0, content: 0 },
1607            Insert {
1608                pos: 238,
1609                content: 238,
1610            },
1611            Delete { pos: 238, len: 238 },
1612            Delete { pos: 238, len: 238 },
1613            Delete { pos: 238, len: 238 },
1614            Delete { pos: 238, len: 238 },
1615            Delete { pos: 238, len: 238 },
1616            Insert {
1617                pos: 123,
1618                content: 123,
1619            },
1620            Insert {
1621                pos: 86,
1622                content: 86,
1623            },
1624            Insert {
1625                pos: 123,
1626                content: 2,
1627            },
1628            Insert {
1629                pos: 254,
1630                content: 123,
1631            },
1632            Insert {
1633                pos: 123,
1634                content: 123,
1635            },
1636            Insert {
1637                pos: 123,
1638                content: 123,
1639            },
1640            Insert {
1641                pos: 123,
1642                content: 123,
1643            },
1644            Insert {
1645                pos: 0,
1646                content: 238,
1647            },
1648            Delete { pos: 238, len: 238 },
1649            Delete { pos: 238, len: 238 },
1650            Delete { pos: 238, len: 238 },
1651            Delete { pos: 238, len: 238 },
1652            Insert {
1653                pos: 238,
1654                content: 123,
1655            },
1656            Delete { pos: 123, len: 123 },
1657            Insert {
1658                pos: 86,
1659                content: 254,
1660            },
1661            Insert {
1662                pos: 33,
1663                content: 238,
1664            },
1665            Delete { pos: 238, len: 238 },
1666            Delete { pos: 238, len: 238 },
1667            Insert {
1668                pos: 123,
1669                content: 2,
1670            },
1671            Insert { pos: 0, content: 0 },
1672            Delete { pos: 238, len: 238 },
1673            Delete { pos: 123, len: 123 },
1674            Insert {
1675                pos: 0,
1676                content: 121,
1677            },
1678            Insert {
1679                pos: 26,
1680                content: 0,
1681            },
1682            Insert { pos: 0, content: 0 },
1683            Insert {
1684                pos: 123,
1685                content: 123,
1686            },
1687            Delete { pos: 238, len: 254 },
1688            Insert {
1689                pos: 144,
1690                content: 238,
1691            },
1692            Delete { pos: 91, len: 238 },
1693            Delete { pos: 238, len: 238 },
1694            Insert {
1695                pos: 123,
1696                content: 238,
1697            },
1698            Delete { pos: 238, len: 238 },
1699            Delete { pos: 0, len: 51 },
1700            Insert {
1701                pos: 123,
1702                content: 123,
1703            },
1704            Insert {
1705                pos: 102,
1706                content: 102,
1707            },
1708            Insert {
1709                pos: 102,
1710                content: 102,
1711            },
1712            Insert {
1713                pos: 123,
1714                content: 123,
1715            },
1716            Delete { pos: 238, len: 238 },
1717            Delete { pos: 238, len: 123 },
1718            Insert {
1719                pos: 123,
1720                content: 123,
1721            },
1722            Insert {
1723                pos: 123,
1724                content: 123,
1725            },
1726            Insert {
1727                pos: 123,
1728                content: 123,
1729            },
1730            Insert {
1731                pos: 123,
1732                content: 86,
1733            },
1734            Delete { pos: 101, len: 144 },
1735            Delete { pos: 238, len: 91 },
1736            Delete { pos: 238, len: 238 },
1737            Insert { pos: 0, content: 0 },
1738            Insert {
1739                pos: 108,
1740                content: 108,
1741            },
1742            Insert { pos: 3, content: 0 },
1743            Insert { pos: 0, content: 0 },
1744            Insert {
1745                pos: 171,
1746                content: 63,
1747            },
1748            Delete { pos: 171, len: 171 },
1749            Delete { pos: 171, len: 171 },
1750            Delete { pos: 171, len: 171 },
1751            Delete { pos: 171, len: 171 },
1752            Delete { pos: 171, len: 171 },
1753            Delete { pos: 171, len: 171 },
1754            Insert { pos: 0, content: 0 },
1755            Insert {
1756                pos: 108,
1757                content: 108,
1758            },
1759            Insert { pos: 0, content: 0 },
1760            Delete { pos: 235, len: 235 },
1761            Insert {
1762                pos: 108,
1763                content: 108,
1764            },
1765            Insert { pos: 8, content: 0 },
1766            Insert {
1767                pos: 127,
1768                content: 135,
1769            },
1770            Delete { pos: 171, len: 171 },
1771            Delete { pos: 0, len: 171 },
1772            Delete { pos: 171, len: 171 },
1773            Delete { pos: 171, len: 171 },
1774            Insert {
1775                pos: 0,
1776                content: 171,
1777            },
1778            Delete { pos: 1, len: 126 },
1779            Delete { pos: 235, len: 154 },
1780            Delete { pos: 171, len: 171 },
1781            Delete { pos: 171, len: 171 },
1782            Insert {
1783                pos: 84,
1784                content: 84,
1785            },
1786            Delete { pos: 171, len: 171 },
1787            Delete { pos: 171, len: 171 },
1788            Delete { pos: 171, len: 171 },
1789            Delete { pos: 171, len: 171 },
1790            Delete { pos: 238, len: 238 },
1791            Delete { pos: 238, len: 238 },
1792            Insert { pos: 0, content: 0 },
1793            Delete { pos: 91, len: 238 },
1794            Delete { pos: 238, len: 238 },
1795            Delete { pos: 238, len: 238 },
1796            Delete { pos: 238, len: 238 },
1797            Delete { pos: 238, len: 238 },
1798            Delete { pos: 171, len: 171 },
1799            Insert {
1800                pos: 249,
1801                content: 1,
1802            },
1803            Insert {
1804                pos: 108,
1805                content: 108,
1806            },
1807            Insert { pos: 0, content: 0 },
1808            Insert {
1809                pos: 108,
1810                content: 108,
1811            },
1812            Delete { pos: 171, len: 171 },
1813            Delete { pos: 171, len: 171 },
1814            Delete { pos: 171, len: 171 },
1815            Delete { pos: 171, len: 171 },
1816            Delete { pos: 171, len: 171 },
1817            Delete { pos: 171, len: 171 },
1818            Delete { pos: 171, len: 171 },
1819            Insert { pos: 0, content: 8 },
1820            Insert {
1821                pos: 108,
1822                content: 32,
1823            },
1824            Insert { pos: 0, content: 0 },
1825            Delete { pos: 235, len: 108 },
1826            Insert {
1827                pos: 108,
1828                content: 108,
1829            },
1830            Delete { pos: 255, len: 6 },
1831            Insert {
1832                pos: 135,
1833                content: 169,
1834            },
1835            Delete { pos: 171, len: 171 },
1836            Insert {
1837                pos: 171,
1838                content: 171,
1839            },
1840            Delete { pos: 171, len: 171 },
1841            Delete { pos: 171, len: 171 },
1842            Insert {
1843                pos: 171,
1844                content: 171,
1845            },
1846            Insert {
1847                pos: 126,
1848                content: 111,
1849            },
1850            Delete { pos: 154, len: 171 },
1851            Delete { pos: 171, len: 171 },
1852            Delete { pos: 171, len: 171 },
1853            Insert {
1854                pos: 84,
1855                content: 171,
1856            },
1857            Delete { pos: 171, len: 171 },
1858            Delete { pos: 171, len: 171 },
1859            Delete { pos: 171, len: 171 },
1860            Delete { pos: 171, len: 171 },
1861            Delete { pos: 171, len: 171 },
1862            Insert {
1863                pos: 108,
1864                content: 108,
1865            },
1866            Insert {
1867                pos: 108,
1868                content: 108,
1869            },
1870            Insert {
1871                pos: 108,
1872                content: 235,
1873            },
1874            Insert {
1875                pos: 108,
1876                content: 108,
1877            },
1878            Insert {
1879                pos: 87,
1880                content: 0,
1881            },
1882            Delete { pos: 1, len: 111 },
1883            Delete { pos: 238, len: 238 },
1884            Insert {
1885                pos: 123,
1886                content: 123,
1887            },
1888            Insert {
1889                pos: 121,
1890                content: 86,
1891            },
1892            Insert {
1893                pos: 123,
1894                content: 123,
1895            },
1896            Insert {
1897                pos: 86,
1898                content: 254,
1899            },
1900            Insert {
1901                pos: 123,
1902                content: 123,
1903            },
1904            Insert {
1905                pos: 123,
1906                content: 123,
1907            },
1908            Insert {
1909                pos: 123,
1910                content: 123,
1911            },
1912            Insert {
1913                pos: 86,
1914                content: 0,
1915            },
1916            Delete { pos: 238, len: 238 },
1917            Delete { pos: 238, len: 238 },
1918            Delete { pos: 254, len: 193 },
1919            Delete { pos: 63, len: 64 },
1920            Insert { pos: 0, content: 0 },
1921            Delete { pos: 235, len: 235 },
1922            Insert {
1923                pos: 108,
1924                content: 108,
1925            },
1926            Insert { pos: 0, content: 8 },
1927            Insert {
1928                pos: 111,
1929                content: 127,
1930            },
1931            Delete { pos: 171, len: 171 },
1932            Delete { pos: 171, len: 0 },
1933            Delete { pos: 171, len: 171 },
1934            Delete { pos: 171, len: 171 },
1935            Delete { pos: 8, len: 0 },
1936            Delete { pos: 249, len: 1 },
1937            Delete { pos: 169, len: 235 },
1938            Delete { pos: 171, len: 171 },
1939            Delete { pos: 171, len: 171 },
1940            Delete { pos: 171, len: 171 },
1941            Delete { pos: 171, len: 171 },
1942            Insert {
1943                pos: 8,
1944                content: 108,
1945            },
1946            Insert {
1947                pos: 108,
1948                content: 108,
1949            },
1950            Insert {
1951                pos: 50,
1952                content: 108,
1953            },
1954            Delete { pos: 108, len: 108 },
1955            Insert {
1956                pos: 108,
1957                content: 8,
1958            },
1959            Insert { pos: 0, content: 0 },
1960            Delete { pos: 169, len: 235 },
1961            Delete { pos: 171, len: 171 },
1962            Delete { pos: 171, len: 171 },
1963            Delete { pos: 171, len: 171 },
1964            Delete { pos: 171, len: 171 },
1965            Insert { pos: 8, content: 0 },
1966            Insert { pos: 0, content: 0 },
1967            Delete { pos: 171, len: 171 },
1968            Delete { pos: 171, len: 171 },
1969            Delete { pos: 41, len: 164 },
1970            Delete { pos: 171, len: 171 },
1971            Delete { pos: 171, len: 171 },
1972            Delete { pos: 171, len: 171 },
1973            Delete { pos: 171, len: 171 },
1974            Delete { pos: 171, len: 171 },
1975            Delete { pos: 171, len: 171 },
1976            Delete { pos: 171, len: 171 },
1977            Delete { pos: 171, len: 171 },
1978            Insert { pos: 0, content: 0 },
1979            Insert {
1980                pos: 108,
1981                content: 108,
1982            },
1983            Insert {
1984                pos: 108,
1985                content: 108,
1986            },
1987            Delete { pos: 235, len: 235 },
1988            Insert {
1989                pos: 108,
1990                content: 108,
1991            },
1992            Insert { pos: 8, content: 0 },
1993            Insert {
1994                pos: 171,
1995                content: 171,
1996            },
1997            Insert { pos: 8, content: 0 },
1998            Insert {
1999                pos: 127,
2000                content: 135,
2001            },
2002            Delete { pos: 171, len: 171 },
2003            Delete { pos: 171, len: 171 },
2004            Delete { pos: 41, len: 171 },
2005            Delete { pos: 171, len: 171 },
2006            Delete { pos: 171, len: 171 },
2007            Delete { pos: 171, len: 41 },
2008            Insert {
2009                pos: 171,
2010                content: 171,
2011            },
2012            Delete { pos: 171, len: 171 },
2013            Delete { pos: 165, len: 171 },
2014            Delete { pos: 171, len: 171 },
2015            Delete { pos: 171, len: 171 },
2016            Delete { pos: 171, len: 171 },
2017            Delete { pos: 171, len: 170 },
2018            Delete { pos: 171, len: 171 },
2019            Delete { pos: 235, len: 235 },
2020            Insert {
2021                pos: 108,
2022                content: 108,
2023            },
2024            Insert {
2025                pos: 108,
2026                content: 108,
2027            },
2028            Insert {
2029                pos: 108,
2030                content: 108,
2031            },
2032            Insert {
2033                pos: 0,
2034                content: 108,
2035            },
2036            Delete { pos: 171, len: 171 },
2037            Delete { pos: 171, len: 171 },
2038            Insert {
2039                pos: 171,
2040                content: 171,
2041            },
2042            Insert { pos: 0, content: 0 },
2043            Insert {
2044                pos: 108,
2045                content: 108,
2046            },
2047            Insert {
2048                pos: 108,
2049                content: 108,
2050            },
2051            Delete { pos: 235, len: 235 },
2052            Insert {
2053                pos: 108,
2054                content: 108,
2055            },
2056            Insert { pos: 8, content: 0 },
2057            Insert {
2058                pos: 127,
2059                content: 135,
2060            },
2061            Delete { pos: 171, len: 171 },
2062            Delete { pos: 171, len: 171 },
2063            Delete { pos: 171, len: 171 },
2064            Insert {
2065                pos: 123,
2066                content: 2,
2067            },
2068            Insert {
2069                pos: 254,
2070                content: 123,
2071            },
2072            Insert {
2073                pos: 123,
2074                content: 123,
2075            },
2076            Insert {
2077                pos: 123,
2078                content: 123,
2079            },
2080            Delete { pos: 238, len: 238 },
2081            Delete { pos: 238, len: 238 },
2082            Insert {
2083                pos: 123,
2084                content: 123,
2085            },
2086            Insert {
2087                pos: 123,
2088                content: 123,
2089            },
2090            Insert {
2091                pos: 123,
2092                content: 123,
2093            },
2094            Insert {
2095                pos: 123,
2096                content: 123,
2097            },
2098            Delete { pos: 255, len: 255 },
2099            Delete { pos: 238, len: 238 },
2100            Delete { pos: 238, len: 238 },
2101            Delete { pos: 238, len: 238 },
2102            Insert {
2103                pos: 123,
2104                content: 123,
2105            },
2106            Insert {
2107                pos: 121,
2108                content: 86,
2109            },
2110            Insert { pos: 0, content: 0 },
2111            Delete { pos: 238, len: 238 },
2112            Insert {
2113                pos: 123,
2114                content: 123,
2115            },
2116            Delete { pos: 255, len: 255 },
2117            Delete { pos: 8, len: 238 },
2118            Delete { pos: 238, len: 238 },
2119            Insert {
2120                pos: 123,
2121                content: 123,
2122            },
2123            Insert {
2124                pos: 123,
2125                content: 123,
2126            },
2127            Insert {
2128                pos: 123,
2129                content: 123,
2130            },
2131            Insert {
2132                pos: 123,
2133                content: 123,
2134            },
2135            Delete { pos: 255, len: 255 },
2136            Delete { pos: 238, len: 238 },
2137            Delete { pos: 238, len: 238 },
2138            Delete { pos: 238, len: 238 },
2139            Delete { pos: 238, len: 238 },
2140            Delete { pos: 238, len: 238 },
2141            Insert {
2142                pos: 238,
2143                content: 238,
2144            },
2145            Insert { pos: 0, content: 0 },
2146            Delete { pos: 91, len: 238 },
2147            Delete { pos: 238, len: 238 },
2148            Delete { pos: 238, len: 238 },
2149            Delete { pos: 238, len: 18 },
2150            Delete { pos: 238, len: 238 },
2151            Delete { pos: 238, len: 238 },
2152            Insert {
2153                pos: 123,
2154                content: 123,
2155            },
2156            Insert {
2157                pos: 121,
2158                content: 86,
2159            },
2160            Insert {
2161                pos: 123,
2162                content: 123,
2163            },
2164            Insert {
2165                pos: 86,
2166                content: 254,
2167            },
2168            Insert {
2169                pos: 123,
2170                content: 123,
2171            },
2172            Insert {
2173                pos: 123,
2174                content: 123,
2175            },
2176            Insert {
2177                pos: 123,
2178                content: 123,
2179            },
2180            Insert {
2181                pos: 0,
2182                content: 123,
2183            },
2184            Delete { pos: 238, len: 238 },
2185            Delete { pos: 238, len: 238 },
2186            Delete { pos: 91, len: 238 },
2187            Delete { pos: 238, len: 238 },
2188            Delete { pos: 238, len: 238 },
2189            Delete { pos: 238, len: 238 },
2190            Delete { pos: 238, len: 123 },
2191            Delete { pos: 238, len: 238 },
2192            Insert {
2193                pos: 121,
2194                content: 86,
2195            },
2196            Insert {
2197                pos: 123,
2198                content: 123,
2199            },
2200            Delete { pos: 238, len: 238 },
2201            Delete { pos: 238, len: 238 },
2202            Insert {
2203                pos: 123,
2204                content: 123,
2205            },
2206            Insert {
2207                pos: 86,
2208                content: 86,
2209            },
2210            Insert {
2211                pos: 202,
2212                content: 238,
2213            },
2214            Delete { pos: 238, len: 238 },
2215            Insert {
2216                pos: 123,
2217                content: 2,
2218            },
2219            Insert {
2220                pos: 254,
2221                content: 123,
2222            },
2223            Insert { pos: 0, content: 0 },
2224            Insert {
2225                pos: 123,
2226                content: 123,
2227            },
2228            Delete { pos: 238, len: 238 },
2229            Delete { pos: 255, len: 101 },
2230            Delete { pos: 238, len: 238 },
2231            Delete { pos: 238, len: 238 },
2232            Insert {
2233                pos: 238,
2234                content: 123,
2235            },
2236            Delete { pos: 123, len: 238 },
2237            Delete { pos: 238, len: 238 },
2238            Insert {
2239                pos: 123,
2240                content: 123,
2241            },
2242            Insert {
2243                pos: 102,
2244                content: 102,
2245            },
2246            Insert {
2247                pos: 102,
2248                content: 102,
2249            },
2250            Insert {
2251                pos: 102,
2252                content: 123,
2253            },
2254            Insert {
2255                pos: 238,
2256                content: 238,
2257            },
2258            Delete { pos: 238, len: 238 },
2259            Insert {
2260                pos: 123,
2261                content: 123,
2262            },
2263            Insert {
2264                pos: 123,
2265                content: 123,
2266            },
2267            Insert {
2268                pos: 123,
2269                content: 123,
2270            },
2271            Insert {
2272                pos: 123,
2273                content: 123,
2274            },
2275            Delete { pos: 255, len: 255 },
2276            Delete { pos: 238, len: 238 },
2277            Delete { pos: 238, len: 238 },
2278            Delete { pos: 1, len: 0 },
2279            Insert { pos: 0, content: 7 },
2280            Insert {
2281                pos: 108,
2282                content: 108,
2283            },
2284            Insert { pos: 0, content: 0 },
2285            Insert {
2286                pos: 108,
2287                content: 108,
2288            },
2289            Delete { pos: 171, len: 171 },
2290            Delete { pos: 171, len: 171 },
2291            Delete { pos: 171, len: 171 },
2292            Delete { pos: 171, len: 171 },
2293            Delete { pos: 171, len: 171 },
2294            Delete { pos: 171, len: 171 },
2295            Delete { pos: 171, len: 108 },
2296            Insert {
2297                pos: 108,
2298                content: 108,
2299            },
2300            Insert { pos: 0, content: 0 },
2301            Insert {
2302                pos: 235,
2303                content: 235,
2304            },
2305            Insert {
2306                pos: 108,
2307                content: 108,
2308            },
2309            Insert { pos: 0, content: 0 },
2310            Insert {
2311                pos: 111,
2312                content: 111,
2313            },
2314            Delete { pos: 154, len: 171 },
2315            Delete { pos: 171, len: 171 },
2316            Delete { pos: 171, len: 171 },
2317            Delete { pos: 171, len: 171 },
2318            Insert {
2319                pos: 171,
2320                content: 8,
2321            },
2322            Delete { pos: 171, len: 249 },
2323            Insert {
2324                pos: 135,
2325                content: 169,
2326            },
2327            Delete { pos: 171, len: 171 },
2328            Delete { pos: 171, len: 171 },
2329            Insert {
2330                pos: 87,
2331                content: 84,
2332            },
2333            Delete { pos: 171, len: 171 },
2334            Delete { pos: 171, len: 171 },
2335            Delete { pos: 171, len: 171 },
2336            Delete { pos: 171, len: 171 },
2337            Delete { pos: 238, len: 238 },
2338            Delete { pos: 11, len: 238 },
2339            Insert { pos: 0, content: 0 },
2340            Delete { pos: 41, len: 238 },
2341            Delete { pos: 238, len: 238 },
2342            Delete { pos: 238, len: 238 },
2343            Delete { pos: 238, len: 238 },
2344            Delete { pos: 238, len: 238 },
2345            Delete { pos: 238, len: 238 },
2346            Delete { pos: 171, len: 0 },
2347            Insert {
2348                pos: 108,
2349                content: 108,
2350            },
2351            Insert { pos: 0, content: 0 },
2352            Insert {
2353                pos: 0,
2354                content: 108,
2355            },
2356            Delete { pos: 63, len: 171 },
2357            Delete { pos: 171, len: 171 },
2358            Delete { pos: 171, len: 171 },
2359            Delete { pos: 171, len: 171 },
2360            Delete { pos: 157, len: 157 },
2361            Delete { pos: 171, len: 171 },
2362            Delete { pos: 171, len: 171 },
2363            Delete { pos: 108, len: 0 },
2364            Insert {
2365                pos: 108,
2366                content: 108,
2367            },
2368            Insert { pos: 0, content: 0 },
2369            Delete { pos: 235, len: 235 },
2370            Insert {
2371                pos: 108,
2372                content: 108,
2373            },
2374            Insert {
2375                pos: 0,
2376                content: 248,
2377            },
2378            Delete { pos: 154, len: 127 },
2379            Delete { pos: 171, len: 171 },
2380            Delete { pos: 171, len: 0 },
2381            Delete { pos: 171, len: 171 },
2382            Delete { pos: 171, len: 171 },
2383            Delete { pos: 8, len: 0 },
2384            Delete { pos: 249, len: 1 },
2385            Delete { pos: 169, len: 235 },
2386            Delete { pos: 171, len: 171 },
2387            Delete { pos: 171, len: 171 },
2388            Insert {
2389                pos: 84,
2390                content: 84,
2391            },
2392            Delete { pos: 171, len: 171 },
2393            Delete { pos: 171, len: 171 },
2394            Delete { pos: 171, len: 171 },
2395            Delete { pos: 171, len: 171 },
2396            Delete { pos: 171, len: 171 },
2397            Insert { pos: 0, content: 8 },
2398            Insert {
2399                pos: 108,
2400                content: 108,
2401            },
2402            Insert {
2403                pos: 108,
2404                content: 49,
2405            },
2406            Delete { pos: 235, len: 108 },
2407            Insert {
2408                pos: 108,
2409                content: 108,
2410            },
2411            Insert {
2412                pos: 0,
2413                content: 249,
2414            },
2415            Insert {
2416                pos: 135,
2417                content: 169,
2418            },
2419            Delete { pos: 238, len: 123 },
2420            Insert { pos: 2, content: 0 },
2421            Insert { pos: 0, content: 0 },
2422            Insert {
2423                pos: 121,
2424                content: 86,
2425            },
2426            Insert {
2427                pos: 123,
2428                content: 123,
2429            },
2430            Insert {
2431                pos: 123,
2432                content: 123,
2433            },
2434            Insert {
2435                pos: 123,
2436                content: 123,
2437            },
2438            Insert {
2439                pos: 123,
2440                content: 1,
2441            },
2442            Delete { pos: 238, len: 238 },
2443            Insert {
2444                pos: 238,
2445                content: 238,
2446            },
2447            Delete { pos: 238, len: 238 },
2448            Insert {
2449                pos: 193,
2450                content: 192,
2451            },
2452            Delete { pos: 63, len: 127 },
2453            Insert {
2454                pos: 0,
2455                content: 235,
2456            },
2457            Insert {
2458                pos: 108,
2459                content: 108,
2460            },
2461            Insert {
2462                pos: 87,
2463                content: 0,
2464            },
2465            Delete { pos: 1, len: 111 },
2466            Delete { pos: 235, len: 154 },
2467            Delete { pos: 171, len: 171 },
2468            Delete { pos: 171, len: 171 },
2469            Delete { pos: 171, len: 171 },
2470            Delete { pos: 0, len: 171 },
2471            Delete { pos: 171, len: 171 },
2472            Insert {
2473                pos: 127,
2474                content: 135,
2475            },
2476            Delete { pos: 171, len: 171 },
2477            Delete { pos: 171, len: 171 },
2478            Delete { pos: 171, len: 171 },
2479            Delete { pos: 171, len: 171 },
2480            Insert { pos: 0, content: 0 },
2481            Insert {
2482                pos: 108,
2483                content: 108,
2484            },
2485            Insert {
2486                pos: 108,
2487                content: 108,
2488            },
2489            Delete { pos: 235, len: 235 },
2490            Insert {
2491                pos: 108,
2492                content: 108,
2493            },
2494            Insert { pos: 0, content: 0 },
2495            Insert {
2496                pos: 127,
2497                content: 135,
2498            },
2499            Delete { pos: 171, len: 171 },
2500            Delete { pos: 171, len: 172 },
2501            Delete { pos: 171, len: 171 },
2502            Delete { pos: 171, len: 171 },
2503            Delete { pos: 171, len: 0 },
2504            Insert { pos: 0, content: 0 },
2505            Insert {
2506                pos: 0,
2507                content: 171,
2508            },
2509            Delete { pos: 171, len: 171 },
2510            Delete { pos: 171, len: 171 },
2511            Delete { pos: 171, len: 171 },
2512            Delete { pos: 171, len: 171 },
2513            Delete { pos: 171, len: 171 },
2514            Delete { pos: 171, len: 171 },
2515            Delete { pos: 171, len: 171 },
2516            Delete { pos: 171, len: 171 },
2517            Delete { pos: 171, len: 171 },
2518            Delete { pos: 171, len: 171 },
2519            Delete { pos: 171, len: 108 },
2520            Insert {
2521                pos: 108,
2522                content: 108,
2523            },
2524            Insert {
2525                pos: 108,
2526                content: 108,
2527            },
2528            Insert {
2529                pos: 235,
2530                content: 235,
2531            },
2532            Insert {
2533                pos: 108,
2534                content: 108,
2535            },
2536            Insert { pos: 0, content: 0 },
2537            Insert {
2538                pos: 111,
2539                content: 111,
2540            },
2541            Delete { pos: 171, len: 0 },
2542            Insert {
2543                pos: 48,
2544                content: 111,
2545            },
2546            Delete { pos: 154, len: 171 },
2547            Delete { pos: 171, len: 171 },
2548            Delete { pos: 171, len: 171 },
2549            Delete { pos: 171, len: 171 },
2550            Delete { pos: 171, len: 171 },
2551            Delete { pos: 171, len: 171 },
2552            Insert {
2553                pos: 84,
2554                content: 84,
2555            },
2556            Delete { pos: 171, len: 171 },
2557            Delete { pos: 171, len: 171 },
2558            Delete { pos: 171, len: 171 },
2559            Delete { pos: 171, len: 171 },
2560            Delete { pos: 171, len: 171 },
2561            Delete { pos: 171, len: 171 },
2562            Delete { pos: 171, len: 171 },
2563            Delete { pos: 171, len: 235 },
2564            Delete { pos: 254, len: 86 },
2565            Insert {
2566                pos: 108,
2567                content: 108,
2568            },
2569            Insert {
2570                pos: 108,
2571                content: 108,
2572            },
2573            Insert { pos: 0, content: 8 },
2574            Insert {
2575                pos: 108,
2576                content: 171,
2577            },
2578            Delete { pos: 171, len: 171 },
2579            Delete { pos: 171, len: 20 },
2580            Delete { pos: 171, len: 108 },
2581            Insert {
2582                pos: 108,
2583                content: 108,
2584            },
2585            Insert {
2586                pos: 108,
2587                content: 108,
2588            },
2589            Insert {
2590                pos: 235,
2591                content: 235,
2592            },
2593            Insert {
2594                pos: 108,
2595                content: 108,
2596            },
2597            Insert { pos: 0, content: 0 },
2598            Insert {
2599                pos: 111,
2600                content: 111,
2601            },
2602            Delete { pos: 154, len: 171 },
2603            Delete { pos: 171, len: 171 },
2604            Delete { pos: 171, len: 171 },
2605            Delete { pos: 123, len: 123 },
2606            Insert {
2607                pos: 86,
2608                content: 86,
2609            },
2610            Insert {
2611                pos: 123,
2612                content: 123,
2613            },
2614            Insert {
2615                pos: 123,
2616                content: 123,
2617            },
2618            Insert {
2619                pos: 123,
2620                content: 238,
2621            },
2622            Delete { pos: 238, len: 238 },
2623            Insert {
2624                pos: 123,
2625                content: 36,
2626            },
2627            Insert {
2628                pos: 123,
2629                content: 123,
2630            },
2631            Insert {
2632                pos: 123,
2633                content: 123,
2634            },
2635            Insert {
2636                pos: 123,
2637                content: 123,
2638            },
2639            Insert {
2640                pos: 254,
2641                content: 255,
2642            },
2643            Delete { pos: 238, len: 238 },
2644            Delete { pos: 238, len: 238 },
2645            Delete { pos: 238, len: 238 },
2646            Delete { pos: 238, len: 123 },
2647            Insert { pos: 0, content: 0 },
2648            Insert { pos: 0, content: 0 },
2649            Delete { pos: 238, len: 238 },
2650            Delete { pos: 238, len: 238 },
2651            Delete { pos: 238, len: 238 },
2652            Delete { pos: 123, len: 123 },
2653            Insert {
2654                pos: 238,
2655                content: 238,
2656            },
2657            Delete { pos: 238, len: 238 },
2658            Delete { pos: 238, len: 238 },
2659            Insert {
2660                pos: 238,
2661                content: 238,
2662            },
2663            Insert { pos: 0, content: 0 },
2664            Delete { pos: 91, len: 238 },
2665            Delete { pos: 238, len: 238 },
2666            Delete { pos: 238, len: 238 },
2667            Delete { pos: 238, len: 238 },
2668            Insert { pos: 0, content: 0 },
2669            Delete { pos: 238, len: 238 },
2670            Delete { pos: 238, len: 238 },
2671            Insert { pos: 0, content: 0 },
2672            Insert {
2673                pos: 238,
2674                content: 238,
2675            },
2676            Insert {
2677                pos: 108,
2678                content: 108,
2679            },
2680            Delete { pos: 238, len: 238 },
2681            Delete { pos: 238, len: 238 },
2682            Insert {
2683                pos: 123,
2684                content: 2,
2685            },
2686            Insert { pos: 0, content: 0 },
2687            Insert {
2688                pos: 238,
2689                content: 238,
2690            },
2691            Insert {
2692                pos: 0,
2693                content: 238,
2694            },
2695            Delete { pos: 238, len: 238 },
2696            Delete { pos: 0, len: 249 },
2697            Insert {
2698                pos: 135,
2699                content: 255,
2700            },
2701            Delete { pos: 255, len: 255 },
2702            Delete { pos: 144, len: 255 },
2703            Delete { pos: 169, len: 169 },
2704        ])
2705    }
2706
2707    #[test]
2708    fn ben() {
2709        use arbitrary::Arbitrary;
2710        #[derive(Arbitrary, Debug, Clone, Copy)]
2711        enum Action {
2712            Insert { pos: u8, content: u8 },
2713            Delete { pos: u8, len: u8 },
2714        }
2715
2716        use rand::{Rng, SeedableRng};
2717        let mut rng = rand::rngs::StdRng::seed_from_u64(123);
2718        let mut expected = String::new();
2719        let unstructured: Vec<u8> = (0..10_000).map(|_| rng.gen()).collect();
2720        let mut gen = arbitrary::Unstructured::new(&unstructured);
2721        let actions: [Action; 1_000] = gen.arbitrary().unwrap();
2722        let mut rope = Rope::new();
2723        for action in actions.iter() {
2724            match *action {
2725                Action::Insert { pos, content } => {
2726                    let pos = pos as usize % (rope.len() + 1);
2727                    let s = content.to_string();
2728                    expected.insert_str(pos, &s);
2729                    rope.insert(pos, &s);
2730                    assert_eq!(expected.len(), rope.len());
2731                }
2732                Action::Delete { pos, len } => {
2733                    let pos = pos as usize % (rope.len() + 1);
2734                    let mut len = len as usize % 10;
2735                    len = len.min(rope.len() - pos);
2736                    expected.drain(pos..pos + len);
2737                    rope.delete_range(pos..(pos + len));
2738                    assert_eq!(expected.len(), rope.len());
2739                }
2740            }
2741        }
2742        assert_eq!(rope.to_string(), expected);
2743    }
2744
2745    #[test]
2746    fn fuzz_7() {
2747        fuzz(vec![
2748            Insert {
2749                pos: 111,
2750                content: 111,
2751            },
2752            Insert { pos: 0, content: 0 },
2753            Insert { pos: 0, content: 0 },
2754            Insert { pos: 0, content: 0 },
2755            Insert { pos: 0, content: 0 },
2756            Insert { pos: 0, content: 0 },
2757            Insert {
2758                pos: 108,
2759                content: 108,
2760            },
2761            Insert {
2762                pos: 108,
2763                content: 108,
2764            },
2765            Insert {
2766                pos: 108,
2767                content: 255,
2768            },
2769            Delete { pos: 255, len: 0 },
2770            Insert {
2771                pos: 140,
2772                content: 140,
2773            },
2774            Insert {
2775                pos: 102,
2776                content: 101,
2777            },
2778            Insert {
2779                pos: 36,
2780                content: 146,
2781            },
2782            Insert {
2783                pos: 102,
2784                content: 119,
2785            },
2786            Insert {
2787                pos: 118,
2788                content: 119,
2789            },
2790            Insert {
2791                pos: 119,
2792                content: 119,
2793            },
2794            Insert {
2795                pos: 21,
2796                content: 0,
2797            },
2798            Insert {
2799                pos: 140,
2800                content: 140,
2801            },
2802            Insert {
2803                pos: 107,
2804                content: 19,
2805            },
2806            Insert {
2807                pos: 102,
2808                content: 47,
2809            },
2810            Insert { pos: 0, content: 0 },
2811            Insert {
2812                pos: 0,
2813                content: 102,
2814            },
2815            Insert { pos: 0, content: 0 },
2816            Insert {
2817                pos: 0,
2818                content: 102,
2819            },
2820            Insert {
2821                pos: 102,
2822                content: 64,
2823            },
2824            Insert {
2825                pos: 64,
2826                content: 64,
2827            },
2828            Insert {
2829                pos: 64,
2830                content: 64,
2831            },
2832            Insert {
2833                pos: 64,
2834                content: 64,
2835            },
2836            Insert {
2837                pos: 64,
2838                content: 64,
2839            },
2840            Insert {
2841                pos: 64,
2842                content: 64,
2843            },
2844            Insert {
2845                pos: 64,
2846                content: 64,
2847            },
2848            Insert {
2849                pos: 123,
2850                content: 123,
2851            },
2852            Delete { pos: 255, len: 136 },
2853            Delete { pos: 119, len: 111 },
2854            Insert {
2855                pos: 102,
2856                content: 102,
2857            },
2858            Insert {
2859                pos: 3,
2860                content: 73,
2861            },
2862            Insert {
2863                pos: 146,
2864                content: 74,
2865            },
2866            Delete { pos: 255, len: 255 },
2867            Delete { pos: 0, len: 102 },
2868            Insert {
2869                pos: 102,
2870                content: 102,
2871            },
2872            Insert {
2873                pos: 102,
2874                content: 102,
2875            },
2876            Insert {
2877                pos: 119,
2878                content: 119,
2879            },
2880            Insert {
2881                pos: 119,
2882                content: 119,
2883            },
2884            Insert { pos: 0, content: 0 },
2885            Delete { pos: 255, len: 255 },
2886            Insert { pos: 0, content: 0 },
2887            Insert {
2888                pos: 0,
2889                content: 255,
2890            },
2891            Delete { pos: 111, len: 108 },
2892            Insert {
2893                pos: 119,
2894                content: 119,
2895            },
2896            Insert {
2897                pos: 119,
2898                content: 119,
2899            },
2900            Insert {
2901                pos: 119,
2902                content: 119,
2903            },
2904            Insert {
2905                pos: 102,
2906                content: 102,
2907            },
2908            Insert {
2909                pos: 83,
2910                content: 108,
2911            },
2912            Insert {
2913                pos: 111,
2914                content: 111,
2915            },
2916            Insert {
2917                pos: 119,
2918                content: 21,
2919            },
2920            Insert {
2921                pos: 119,
2922                content: 119,
2923            },
2924            Insert {
2925                pos: 64,
2926                content: 64,
2927            },
2928            Insert {
2929                pos: 64,
2930                content: 64,
2931            },
2932            Insert {
2933                pos: 64,
2934                content: 64,
2935            },
2936            Insert {
2937                pos: 55,
2938                content: 119,
2939            },
2940            Insert {
2941                pos: 119,
2942                content: 119,
2943            },
2944            Insert { pos: 0, content: 0 },
2945            Insert {
2946                pos: 119,
2947                content: 119,
2948            },
2949            Insert {
2950                pos: 123,
2951                content: 123,
2952            },
2953            Insert {
2954                pos: 121,
2955                content: 86,
2956            },
2957            Insert {
2958                pos: 123,
2959                content: 123,
2960            },
2961            Insert {
2962                pos: 125,
2963                content: 125,
2964            },
2965            Insert {
2966                pos: 125,
2967                content: 125,
2968            },
2969            Insert {
2970                pos: 125,
2971                content: 125,
2972            },
2973            Insert {
2974                pos: 125,
2975                content: 125,
2976            },
2977            Insert {
2978                pos: 125,
2979                content: 125,
2980            },
2981            Insert {
2982                pos: 125,
2983                content: 125,
2984            },
2985            Insert {
2986                pos: 125,
2987                content: 125,
2988            },
2989            Insert {
2990                pos: 125,
2991                content: 125,
2992            },
2993            Insert {
2994                pos: 125,
2995                content: 125,
2996            },
2997            Insert {
2998                pos: 125,
2999                content: 125,
3000            },
3001            Insert {
3002                pos: 125,
3003                content: 125,
3004            },
3005            Insert {
3006                pos: 125,
3007                content: 125,
3008            },
3009            Insert {
3010                pos: 125,
3011                content: 125,
3012            },
3013            Insert {
3014                pos: 125,
3015                content: 125,
3016            },
3017            Insert {
3018                pos: 125,
3019                content: 125,
3020            },
3021            Delete { pos: 130, len: 130 },
3022            Insert {
3023                pos: 125,
3024                content: 125,
3025            },
3026            Insert {
3027                pos: 125,
3028                content: 125,
3029            },
3030            Insert {
3031                pos: 125,
3032                content: 125,
3033            },
3034            Insert {
3035                pos: 123,
3036                content: 123,
3037            },
3038            Insert {
3039                pos: 123,
3040                content: 123,
3041            },
3042            Insert {
3043                pos: 119,
3044                content: 119,
3045            },
3046            Insert {
3047                pos: 96,
3048                content: 102,
3049            },
3050            Insert {
3051                pos: 119,
3052                content: 119,
3053            },
3054            Insert {
3055                pos: 156,
3056                content: 111,
3057            },
3058            Insert {
3059                pos: 123,
3060                content: 37,
3061            },
3062            Insert {
3063                pos: 123,
3064                content: 123,
3065            },
3066            Insert {
3067                pos: 123,
3068                content: 123,
3069            },
3070            Insert {
3071                pos: 37,
3072                content: 121,
3073            },
3074            Insert {
3075                pos: 123,
3076                content: 123,
3077            },
3078            Insert {
3079                pos: 125,
3080                content: 125,
3081            },
3082            Insert {
3083                pos: 125,
3084                content: 125,
3085            },
3086            Insert {
3087                pos: 125,
3088                content: 125,
3089            },
3090            Insert {
3091                pos: 125,
3092                content: 125,
3093            },
3094            Insert {
3095                pos: 125,
3096                content: 125,
3097            },
3098            Insert {
3099                pos: 125,
3100                content: 125,
3101            },
3102            Insert {
3103                pos: 125,
3104                content: 125,
3105            },
3106            Insert {
3107                pos: 125,
3108                content: 125,
3109            },
3110            Insert {
3111                pos: 125,
3112                content: 125,
3113            },
3114            Insert {
3115                pos: 125,
3116                content: 125,
3117            },
3118            Insert {
3119                pos: 123,
3120                content: 123,
3121            },
3122            Insert {
3123                pos: 121,
3124                content: 86,
3125            },
3126            Insert {
3127                pos: 123,
3128                content: 123,
3129            },
3130            Insert {
3131                pos: 125,
3132                content: 125,
3133            },
3134            Insert {
3135                pos: 125,
3136                content: 125,
3137            },
3138            Insert {
3139                pos: 125,
3140                content: 125,
3141            },
3142            Insert {
3143                pos: 125,
3144                content: 125,
3145            },
3146            Insert {
3147                pos: 125,
3148                content: 125,
3149            },
3150            Insert {
3151                pos: 125,
3152                content: 125,
3153            },
3154            Insert {
3155                pos: 125,
3156                content: 125,
3157            },
3158            Insert {
3159                pos: 125,
3160                content: 125,
3161            },
3162            Insert {
3163                pos: 125,
3164                content: 125,
3165            },
3166            Insert {
3167                pos: 125,
3168                content: 125,
3169            },
3170            Insert {
3171                pos: 125,
3172                content: 125,
3173            },
3174            Insert {
3175                pos: 125,
3176                content: 125,
3177            },
3178            Insert {
3179                pos: 125,
3180                content: 125,
3181            },
3182            Insert {
3183                pos: 125,
3184                content: 125,
3185            },
3186            Insert {
3187                pos: 125,
3188                content: 125,
3189            },
3190            Insert {
3191                pos: 125,
3192                content: 125,
3193            },
3194            Insert {
3195                pos: 125,
3196                content: 125,
3197            },
3198            Insert {
3199                pos: 125,
3200                content: 125,
3201            },
3202            Insert {
3203                pos: 125,
3204                content: 125,
3205            },
3206            Insert {
3207                pos: 125,
3208                content: 125,
3209            },
3210            Insert {
3211                pos: 125,
3212                content: 125,
3213            },
3214            Insert {
3215                pos: 125,
3216                content: 125,
3217            },
3218            Insert {
3219                pos: 125,
3220                content: 125,
3221            },
3222            Insert {
3223                pos: 125,
3224                content: 125,
3225            },
3226            Insert {
3227                pos: 125,
3228                content: 125,
3229            },
3230            Insert {
3231                pos: 125,
3232                content: 123,
3233            },
3234            Insert {
3235                pos: 125,
3236                content: 125,
3237            },
3238            Insert {
3239                pos: 125,
3240                content: 125,
3241            },
3242            Insert {
3243                pos: 125,
3244                content: 125,
3245            },
3246            Insert {
3247                pos: 125,
3248                content: 125,
3249            },
3250            Insert {
3251                pos: 125,
3252                content: 125,
3253            },
3254            Insert {
3255                pos: 125,
3256                content: 125,
3257            },
3258            Insert {
3259                pos: 125,
3260                content: 125,
3261            },
3262            Insert {
3263                pos: 125,
3264                content: 125,
3265            },
3266            Delete { pos: 239, len: 239 },
3267            Insert {
3268                pos: 125,
3269                content: 125,
3270            },
3271            Insert {
3272                pos: 125,
3273                content: 125,
3274            },
3275            Insert {
3276                pos: 125,
3277                content: 125,
3278            },
3279            Insert {
3280                pos: 125,
3281                content: 125,
3282            },
3283            Insert {
3284                pos: 125,
3285                content: 125,
3286            },
3287            Insert {
3288                pos: 125,
3289                content: 125,
3290            },
3291            Insert {
3292                pos: 125,
3293                content: 125,
3294            },
3295            Insert {
3296                pos: 125,
3297                content: 125,
3298            },
3299            Insert {
3300                pos: 125,
3301                content: 125,
3302            },
3303            Insert {
3304                pos: 125,
3305                content: 125,
3306            },
3307            Insert {
3308                pos: 125,
3309                content: 125,
3310            },
3311            Insert {
3312                pos: 125,
3313                content: 125,
3314            },
3315            Insert {
3316                pos: 125,
3317                content: 125,
3318            },
3319            Insert {
3320                pos: 125,
3321                content: 125,
3322            },
3323            Insert {
3324                pos: 125,
3325                content: 125,
3326            },
3327            Insert {
3328                pos: 125,
3329                content: 125,
3330            },
3331            Insert {
3332                pos: 125,
3333                content: 123,
3334            },
3335            Insert {
3336                pos: 123,
3337                content: 123,
3338            },
3339            Insert {
3340                pos: 123,
3341                content: 0,
3342            },
3343            Delete { pos: 255, len: 255 },
3344            Delete { pos: 255, len: 255 },
3345            Delete { pos: 255, len: 255 },
3346            Delete { pos: 255, len: 255 },
3347            Delete { pos: 255, len: 255 },
3348            Delete { pos: 255, len: 255 },
3349            Delete { pos: 255, len: 255 },
3350            Delete { pos: 125, len: 125 },
3351            Insert {
3352                pos: 125,
3353                content: 125,
3354            },
3355            Insert {
3356                pos: 125,
3357                content: 125,
3358            },
3359            Insert {
3360                pos: 125,
3361                content: 125,
3362            },
3363            Insert {
3364                pos: 125,
3365                content: 125,
3366            },
3367            Insert {
3368                pos: 123,
3369                content: 123,
3370            },
3371            Insert {
3372                pos: 118,
3373                content: 118,
3374            },
3375            Insert {
3376                pos: 255,
3377                content: 255,
3378            },
3379            Insert {
3380                pos: 119,
3381                content: 119,
3382            },
3383            Insert {
3384                pos: 102,
3385                content: 102,
3386            },
3387            Delete { pos: 209, len: 255 },
3388            Delete { pos: 255, len: 255 },
3389        ])
3390    }
3391
3392    #[test]
3393    fn from_str() {
3394        for i in 0..100000 {
3395            let s = i.to_string();
3396            let mut g = GapBuffer::from_str(&s);
3397            assert_eq!(s.len(), g.next().unwrap().len());
3398        }
3399    }
3400
3401    #[test]
3402    fn from_iter() {
3403        let mut v = vec![];
3404        for i in 0..100000 {
3405            v.push(i.to_string());
3406        }
3407
3408        let rope = Rope {
3409            tree: v
3410                .iter()
3411                .flat_map(|x| GapBuffer::from_str(x.as_str()))
3412                .collect(),
3413            cursor: None,
3414        };
3415
3416        let s = v.join("");
3417        assert_eq!(rope.to_string(), s);
3418        assert_eq!(rope.len(), s.len());
3419        rope.tree.check();
3420    }
3421
3422    #[test]
3423    fn drain() {
3424        let mut rope = Rope::new();
3425        for i in 0..100000 {
3426            rope.insert(0, &i.to_string());
3427        }
3428
3429        while !rope.is_empty() {
3430            let leaf = rope.tree.first_leaf();
3431            rope.tree.update_leaf(leaf.unwrap(), |elem| {
3432                elem.slice_(1..1);
3433                (true, None, None)
3434            });
3435        }
3436    }
3437
3438    #[test]
3439    fn fuzz_empty() {
3440        fuzz(vec![])
3441    }
3442}