unison-util-rope-0.0.0
Safe HaskellNone
LanguageHaskell2010

Unison.Util.Rope

Description

A rope: a sequence of chunks that knows its size in elements (the characters of a text, the bytes of a byte string).

It is the finger tree of Unison.Util.Deque with chunks for elements and sizes counted in what the chunks hold. The middle of the tree is the Deque's own middle, a sequence of nodes that knows the size under each; only the top level, whose items are chunks, is written here.

Invariants:

  • no chunk is empty
  • a rope of one chunk is One; a Deep has a chunk in each digit
  • two chunks next to each other hold more than threshold elements between them, so a rope of n elements has at most 2n / threshold + 1 chunks however it was built
Synopsis

Documentation

chunks :: Rope a -> [a] Source #

fromChunks :: (Sized a, Semigroup a) => [a] -> Rope a Source #

singleton :: Sized a => a -> Rope a Source #

one :: Sized a => a -> Rope a Source #

map :: (Sized b, Semigroup b) => (a -> b) -> Rope a -> Rope b Source #

The result is rebuilt from the chunks the function returns, so it is a rope whatever their sizes are.

traverse :: (Applicative f, Sized b, Semigroup b) => (a -> f b) -> Rope a -> f (Rope b) Source #

traverseWithPos_ :: (Applicative f, Sized a) => (Int -> a -> f ()) -> Rope a -> f () Source #

flatten :: Monoid a => Rope a -> a Source #

two :: (Sized a, Semigroup a) => Rope a -> Rope a -> Rope a Source #

cons :: (Sized a, Semigroup a) => a -> Rope a -> Rope a Source #

uncons :: Sized a => Rope a -> Maybe (a, Rope a) Source #

snoc :: (Sized a, Semigroup a) => Rope a -> a -> Rope a Source #

unsnoc :: Sized a => Rope a -> Maybe (Rope a, a) Source #

index :: (Sized a, Index a ch) => Int -> Rope a -> Maybe ch Source #

debugDepth :: Rope a -> Int Source #

The number of levels below the top one.

extractChunk :: (Monoid a, Sized a, Take a, Drop a) => Int -> Int -> Rope a -> a Source #

threshold :: Int Source #

Two chunks next to each other with this many elements or fewer between them are made one chunk.

See https://github.com/unisonweb/unison/pull/1899#discussion_r742953469

valid :: Sized a => Rope a -> Either String () Source #

Checks the invariants.

class Sized a where Source #

Methods

size :: a -> Int Source #

Instances

Instances details
Sized a => Sized (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

size :: Rope a -> Int Source #

class Take a where Source #

Methods

take :: Int -> a -> a Source #

Instances

Instances details
(Sized a, Semigroup a, Take a) => Take (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

take :: Int -> Rope a -> Rope a Source #

class Drop a where Source #

Methods

drop :: Int -> a -> a Source #

Instances

Instances details
(Sized a, Semigroup a, Drop a) => Drop (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

drop :: Int -> Rope a -> Rope a Source #

class Reverse a where Source #

Methods

reverse :: a -> a Source #

Instances

Instances details
(Sized a, Semigroup a, Reverse a) => Reverse (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

reverse :: Rope a -> Rope a Source #

class Index a elem where Source #

Methods

unsafeIndex :: Int -> a -> elem Source #

Instances

Instances details
(Sized a, Index a ch) => Index (Rope a) ch Source # 
Instance details

Defined in Unison.Util.Rope

Methods

unsafeIndex :: Int -> Rope a -> ch Source #

data Rope a Source #

The first Int of Deep packs three numbers, as in the Deque: the size of the rope (bits 8 and up), the number of chunks in the suffix (bits 4 to 7) and in the prefix (bits 0 to 3). The second is the size of the prefix. The prefix runs front to back and the suffix back to front, so the first and last chunks of the rope are the heads of the two lists.

Constructors

Empty 
One !a 
Deep !Int !Int !(SList a) !(Mid a) !(SList a) 

Instances

Instances details
Foldable Rope Source # 
Instance details

Defined in Unison.Util.Rope

Methods

fold :: Monoid m => Rope m -> m #

foldMap :: Monoid m => (a -> m) -> Rope a -> m #

foldMap' :: Monoid m => (a -> m) -> Rope a -> m #

foldr :: (a -> b -> b) -> b -> Rope a -> b #

foldr' :: (a -> b -> b) -> b -> Rope a -> b #

foldl :: (b -> a -> b) -> b -> Rope a -> b #

foldl' :: (b -> a -> b) -> b -> Rope a -> b #

foldr1 :: (a -> a -> a) -> Rope a -> a #

foldl1 :: (a -> a -> a) -> Rope a -> a #

toList :: Rope a -> [a] #

null :: Rope a -> Bool #

length :: Rope a -> Int #

elem :: Eq a => a -> Rope a -> Bool #

maximum :: Ord a => Rope a -> a #

minimum :: Ord a => Rope a -> a #

sum :: Num a => Rope a -> a #

product :: Num a => Rope a -> a #

NFData a => NFData (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

rnf :: Rope a -> () #

(Sized a, Semigroup a) => Monoid (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

mempty :: Rope a #

mappend :: Rope a -> Rope a -> Rope a #

mconcat :: [Rope a] -> Rope a #

(Sized a, Semigroup a) => Semigroup (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

(<>) :: Rope a -> Rope a -> Rope a #

sconcat :: NonEmpty (Rope a) -> Rope a #

stimes :: Integral b => b -> Rope a -> Rope a #

(Sized a, Take a, Drop a, Eq a) => Eq (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

(==) :: Rope a -> Rope a -> Bool #

(/=) :: Rope a -> Rope a -> Bool #

(Sized a, Take a, Drop a, Ord a) => Ord (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

compare :: Rope a -> Rope a -> Ordering #

(<) :: Rope a -> Rope a -> Bool #

(<=) :: Rope a -> Rope a -> Bool #

(>) :: Rope a -> Rope a -> Bool #

(>=) :: Rope a -> Rope a -> Bool #

max :: Rope a -> Rope a -> Rope a #

min :: Rope a -> Rope a -> Rope a #

(Sized a, Semigroup a, Drop a) => Drop (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

drop :: Int -> Rope a -> Rope a Source #

(Sized a, Semigroup a, Reverse a) => Reverse (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

reverse :: Rope a -> Rope a Source #

Sized a => Sized (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

size :: Rope a -> Int Source #

(Sized a, Semigroup a, Take a) => Take (Rope a) Source # 
Instance details

Defined in Unison.Util.Rope

Methods

take :: Int -> Rope a -> Rope a Source #

(Sized a, Index a ch) => Index (Rope a) ch Source # 
Instance details

Defined in Unison.Util.Rope

Methods

unsafeIndex :: Int -> Rope a -> ch Source #