Copyright | (c) Edward Kmett 2011-2015 (c) Ross Paterson 2008 |
---|---|
License | BSD-style |
Maintainer | ekmett@gmail.com |
Stability | experimental |
Portability | non-portable (MPTCs, type families, functional dependencies) |
Safe Haskell | Safe |
Language | Haskell2010 |
Interval maps implemented using the FingerTree
type, following
section 4.8 of
- Ralf Hinze and Ross Paterson, "Finger trees: a simple general-purpose data structure", Journal of Functional Programming 16:2 (2006) pp 197-217. http://www.soi.city.ac.uk/~ross/papers/FingerTree.html
An amortized running time is given for each operation, with n referring to the size of the priority queue. These bounds hold even in a persistent (shared) setting.
Note: Many of these operations have the same names as similar
operations on lists in the Prelude. The ambiguity may be resolved
using either qualification or the hiding
clause.
Unlike Data.IntervalMap.FingerTree, this version sorts things so that the largest interval from a given point comes first. This way if you have nested intervals, you get the outermost interval before the contained intervals.
Synopsis
- data Interval v = Interval {}
- newtype IntervalMap v a = IntervalMap {
- runIntervalMap :: FingerTree (IntInterval v) (Node v a)
- singleton :: Ord v => Interval v -> a -> IntervalMap v a
- insert :: Ord v => v -> v -> a -> IntervalMap v a -> IntervalMap v a
- search :: Ord v => v -> IntervalMap v a -> [(Interval v, a)]
- intersections :: Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
- dominators :: Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)]
- offset :: (Ord v, Monoid v) => v -> IntervalMap v a -> IntervalMap v a
- data IntInterval v
- = NoInterval
- | IntInterval (Interval v) v
- fromList :: Ord v => [(v, v, a)] -> IntervalMap v a
Intervals
A closed interval. The lower bound should be less than or equal to the higher bound.
Instances
Interval maps
newtype IntervalMap v a Source #
Map of closed intervals, possibly with duplicates.
The Foldable
and Traversable
instances process the intervals in
lexicographical order.
IntervalMap | |
|
Instances
singleton :: Ord v => Interval v -> a -> IntervalMap v a Source #
O(1). Interval map with a single entry.
insert :: Ord v => v -> v -> a -> IntervalMap v a -> IntervalMap v a Source #
O(log n). Insert an interval into a map. The map may contain duplicate intervals; the new entry will be inserted before any existing entries for the same interval.
Searching
search :: Ord v => v -> IntervalMap v a -> [(Interval v, a)] Source #
O(k log (n/k)). All intervals that contain the given point, in lexicographical order.
intersections :: Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)] Source #
O(k log (n/k)). All intervals that intersect with the given interval, in lexicographical order.
dominators :: Ord v => v -> v -> IntervalMap v a -> [(Interval v, a)] Source #
O(k log (n/k)). All intervals that contain the given interval, in lexicographical order.
Prepending an offset onto every interval in the map
offset :: (Ord v, Monoid v) => v -> IntervalMap v a -> IntervalMap v a Source #
O(n). Add a delta to each interval in the map
The result monoid
data IntInterval v Source #
NoInterval | |
IntInterval (Interval v) v |
Instances
Ord v => Semigroup (IntInterval v) Source # | |
Defined in Text.Trifecta.Util.IntervalMap (<>) :: IntInterval v -> IntInterval v -> IntInterval v # sconcat :: NonEmpty (IntInterval v) -> IntInterval v # stimes :: Integral b => b -> IntInterval v -> IntInterval v # | |
Ord v => Monoid (IntInterval v) Source # | |
Defined in Text.Trifecta.Util.IntervalMap mempty :: IntInterval v # mappend :: IntInterval v -> IntInterval v -> IntInterval v # mconcat :: [IntInterval v] -> IntInterval v # | |
Ord v => Measured (IntInterval v) (IntervalMap v a) Source # | |
Defined in Text.Trifecta.Util.IntervalMap measure :: IntervalMap v a -> IntInterval v # |
fromList :: Ord v => [(v, v, a)] -> IntervalMap v a Source #