1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//!
//! `flo_rope` is an implementation of the rope data structure designed for FlowBetween.
//! 
//! This is a Rust library containing an implementation of the rope data structure.
//! Ropes are an extension of the string type that support efficient manipulation of
//! very large amounts of data.
//! 
//! `flo_rope` adds a couple of extensions to the usual features of the data structure:
//! 
//!  * It allows for ropes of any 'cell' type so it's not just a replacement for 
//!    character strings but also vector types with the same editing properties
//!  * It supports attaching attributes to regions in the rope. This makes it suitable
//!    for tasks like representing text with attached formatting information.
//!  * It supplies a 'push' and 'pull' model for mirroring changes to a rope elsewhere.
//!    (for example, to update a user interface in response to changes to the rope)
//! 
//! Ropes are quite typically used for text editors for their performance 
//! characteristics: `flo_rope` provides a way to represent text colours and set up a 
//! pipeline to use those colours to perform syntax highlighting. The 'pull' model is
//! highly suited to representing text regions (and other collection data structures) 
//! in a reactive user interface.
//! 
//! A companion library, `flo_binding` will provide support for the reactive model of 
//! ropes, suitable for integrating into a user interface.
//! 
//! ## Examples
//! 
//! Replacing a range in a rope
//! 
//! ```
//! use flo_rope::*;
//! 
//! let mut rope = AttributedRope::<_, ()>::from(vec![1, 2, 3, 4, 5, 6, 7, 8]);
//! 
//! rope.replace(1..3, vec![42]);
//! assert!(rope.read_cells(0..rope.len()).cloned().collect::<Vec<_>>() == vec![1,42,4,5,6,7,8]);
//! ```

pub mod api;
pub mod rope;
pub mod stream_rope;

pub use crate::api::*;
pub use crate::rope::*;
pub use crate::stream_rope::*;