Skip to contents

What is an interval index?

interval_index stores elements with interval endpoints and supports immutable relation queries.

ix <- interval_index(
  "A", "B", "C",
  start = c(1, 2, 4),
  end = c(3, 2, 5)
)
ix
#> Unnamed interval_index with 3 elements, default bounds [start, end).
#> 
#> Elements (by interval start order):
#> 
#> [[1]] (interval [1, 3))
#> [1] "A"
#> 
#> [[2]] (interval [2, 2))
#> [1] "B"
#> 
#> [[3]] (interval [4, 5))
#> [1] "C"

as_flexseq(ix) returns payload-only values by default. Use as_flexseq(ix, drop_meta = FALSE) to keep interval entry records.

Point query

peek_point(ix, 2)
#> [1] "A"
as.list(peek_all_point(ix, 2))
#> [[1]]
#> [1] "A"

Interval relations

peek_overlaps(ix, 2, 3)
#> [1] "A"
as.list(peek_all_overlaps(ix, 2, 3))
#> [[1]]
#> [1] "A"

peek_containing(ix, 2, 2)
#> [1] "A"
peek_within(ix, 1, 4)
#> [1] "A"

Pop queries

p1 <- pop_point(ix, 2)
p1$value
#> [1] "A"
p1$start
#> [1] 1
p1$end
#> [1] 3
p1$remaining
#> Unnamed interval_index with 2 elements, default bounds [start, end).
#> 
#> Elements (by interval start order):
#> 
#> [[1]] (interval [2, 2))
#> [1] "B"
#> 
#> [[2]] (interval [4, 5))
#> [1] "C"

p_all <- pop_all_overlaps(ix, 2, 3)
as.list(p_all$values)
#> list()
p_all$remaining
#> Unnamed interval_index with 2 elements, default bounds [start, end).
#> 
#> Elements (by interval start order):
#> 
#> [[1]] (interval [2, 2))
#> [1] "B"
#> 
#> [[2]] (interval [4, 5))
#> [1] "C"

Boundary modes

Use bounds to control endpoint inclusion ("[)", "[]", "()", "(]").

edge <- interval_index("E", start = 1, end = 3, bounds = "[)")
peek_point(edge, 3)
#> NULL
peek_point(edge, 3, bounds = "[]")
#> [1] "E"

Insert

ix2 <- insert(ix, "D", start = 2, end = 6)
ix2
#> Unnamed interval_index with 4 elements, default bounds [start, end).
#> 
#> Elements (by interval start order):
#> 
#> [[1]] (interval [1, 3))
#> [1] "A"
#> 
#> [[2]] (interval [2, 2))
#> [1] "B"
#> 
#> [[3]] (interval [2, 6))
#> [1] "D"
#> 
#> [[4]] (interval [4, 5))
#> [1] "C"