unison-util-rope-0.0.0
Safe HaskellNone
LanguageHaskell2010

Unison.Util.Deque.Internal

Description

A strict finger tree.

  • amortized O(1) cons, snoc, uncons, unsnoc when a sequence is used once; O(log n) in the worst case, which a program can hit repeatedly only by going back to the same old version
  • O(1) size
  • O(log n) lookup, append, take, drop
  • no laziness anywhere: every field is strict, nothing is a thunk

The shape is Hinze and Paterson's: a prefix digit, a middle that is a sequence of nodes, a suffix digit. The differences are that the middle is strict, digits hold up to maxD items, and nodes are mostly eight wide. The one invariant is that both digits of a tree with a middle have an item (so the ends, and what is near them, are found without going down). A digit that fills up sheds a node of eight into the middle, and a digit that empties takes a node out of it.

Digits are short lists, so that adding or removing an item at an end allocates one cell or none. A node's children are in an array (or, for the nodes of eight leaves, in the node itself): a node is built once and then only read.

Synopsis

The type

type Seq = Deque Source #

pattern Empty :: Deque a Source #

pattern (:<|) :: a -> Deque a -> Deque a infixr 5 Source #

pattern (:|>) :: Deque a -> a -> Deque a infixl 5 Source #

Construction

cons :: a -> Deque a -> Deque a Source #

snoc :: Deque a -> a -> Deque a Source #

append :: Deque a -> Deque a -> Deque a Source #

(<|) :: a -> Deque a -> Deque a infixr 5 Source #

(|>) :: Deque a -> a -> Deque a infixl 5 Source #

(><) :: Deque a -> Deque a -> Deque a infixr 5 Source #

fromList :: [a] -> Deque a Source #

O(n). A fold, so that it fuses with a list that is being produced.

fromListN :: Int -> [a] -> Deque a Source #

fromList for a list whose length is known. O(n). Exactly n elements are taken; a shorter list is an error. (unsafeFromListN is the same without the check, for a caller that built the list to length.)

unsafeFromListN :: Int -> [a] -> Deque a Source #

fromListN for a list known to have exactly n elements. O(n). Builds the levels directly: each gets a prefix of two to nine items and a suffix of five, and what is between them goes, in nodes of eight, to the level below. The count is trusted: with more elements than n the suffix holds them all while the packed count says five, and a later append writes outside an array.

fromFunction :: Int -> (Int -> a) -> Deque a Source #

fromFunction n f is f 0, f 1, ..., f (n - 1).

Queries

lookup :: Int -> Deque a -> Maybe a Source #

toList :: Deque a -> [a] Source #

The elements in order. Lazy: the list is produced as it is consumed.

Taking apart

uncons :: Deque a -> Maybe (a, Deque a) Source #

unsnoc :: Deque a -> Maybe (Deque a, a) Source #

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

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

splitAt :: Int -> Deque a -> (Deque a, Deque a) Source #

splitAt i d = (take i d, drop i d)

Whole-sequence transformations (these rebuild the sequence)

sort :: Ord a => Deque a -> Deque a Source #

A stable sort. O(n log n); goes through a list.

sortBy :: (a -> a -> Ordering) -> Deque a -> Deque a Source #

unstableSort :: Ord a => Deque a -> Deque a Source #

The same as sort here; Data.Sequence has both.

unstableSortBy :: (a -> a -> Ordering) -> Deque a -> Deque a Source #

intersperse :: a -> Deque a -> Deque a Source #

For tests

The parts Rope is built from: digits, nodes, and the

data Deque a Source #

Constructors

Nil 
Deep !Int !(SList a) !(Mid a) !(SList a) 

Instances

Instances details
Eq1 Deque Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

liftEq :: (a -> b -> Bool) -> Deque a -> Deque b -> Bool #

Ord1 Deque Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

liftCompare :: (a -> b -> Ordering) -> Deque a -> Deque b -> Ordering #

Show1 Deque Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Deque a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Deque a] -> ShowS #

Functor Deque Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

fmap :: (a -> b) -> Deque a -> Deque b #

(<$) :: a -> Deque b -> Deque a #

Foldable Deque Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

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

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

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

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

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

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

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

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

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

toList :: Deque a -> [a] #

null :: Deque a -> Bool #

length :: Deque a -> Int #

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

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

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

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

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

Traversable Deque Source #

Rebuilds the sequence. O(n).

Instance details

Defined in Unison.Util.Deque.Internal

Methods

traverse :: Applicative f => (a -> f b) -> Deque a -> f (Deque b) #

sequenceA :: Applicative f => Deque (f a) -> f (Deque a) #

mapM :: Monad m => (a -> m b) -> Deque a -> m (Deque b) #

sequence :: Monad m => Deque (m a) -> m (Deque a) #

NFData a => NFData (Deque a) Source #

The structure is always evaluated; this evaluates the elements fully.

Instance details

Defined in Unison.Util.Deque.Internal

Methods

rnf :: Deque a -> () #

Monoid (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

mempty :: Deque a #

mappend :: Deque a -> Deque a -> Deque a #

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

Semigroup (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

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

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

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

IsList (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Associated Types

type Item (Deque a) 
Instance details

Defined in Unison.Util.Deque.Internal

type Item (Deque a) = a

Methods

fromList :: [Item (Deque a)] -> Deque a #

fromListN :: Int -> [Item (Deque a)] -> Deque a #

toList :: Deque a -> [Item (Deque a)] #

Show a => Show (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

showsPrec :: Int -> Deque a -> ShowS #

show :: Deque a -> String #

showList :: [Deque a] -> ShowS #

Eq a => Eq (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

Methods

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

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

Ord a => Ord (Deque a) Source #

Lexicographic, as for lists.

Instance details

Defined in Unison.Util.Deque.Internal

Methods

compare :: Deque a -> Deque a -> Ordering #

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

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

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

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

max :: Deque a -> Deque a -> Deque a #

min :: Deque a -> Deque a -> Deque a #

type Item (Deque a) Source # 
Instance details

Defined in Unison.Util.Deque.Internal

type Item (Deque a) = a

data SList a Source #

Constructors

SNil 
SCons !a !(SList a) 

data Node a Source #

Constructors

N8 !a !a !a !a !a !a !a !a 
NA !Int !(Arr a) 

data Mid a Source #

Constructors

MNil 
MDeep !Int !Int !(SList (Node a)) !(Mid (Node a)) !(SList (Node a)) 

takeS :: Int -> SList a -> SList a Source #

dropS :: Int -> SList a -> SList a Source #

appendS :: SList a -> SList a -> SList a Source #

revS :: SList a -> SList a Source #

revOnto :: SList a -> SList a -> SList a Source #

listS :: SList a -> [a] Source #

arr8 :: a -> a -> a -> a -> a -> a -> a -> a -> Arr a Source #

nodeAt :: Int -> Node a -> a Source #

mk :: Int -> Int -> Int -> Int Source #

sizeM :: Mid a -> Int Source #

consM :: Node a -> Mid a -> Mid a Source #

snocM :: Mid a -> Node a -> Mid a Source #

unconsM :: Mid a -> (Node a, Mid a) Source #

unsnocM :: Mid a -> (Mid a, Node a) Source #

scanFwd :: Int -> SList (Node a) -> (Node a, Int) Source #

scanBwd :: Int -> SList (Node a) -> (Node a, Int) Source #

scanKids :: Int -> Node (Node a) -> (Int, Int) Source #

takeM :: Int -> Mid a -> (Mid a, Node a, Int) Source #

dropM :: Int -> Mid a -> (Node a, Int, Mid a) Source #

appM :: Mid a -> Int -> SList (Node a) -> Mid a -> Mid a Source #

foldrM :: (Node a -> r -> r) -> r -> Mid a -> r Source #

foldrS :: (a -> r -> r) -> r -> SList a -> r Source #

foldrRev :: (a -> r -> r) -> r -> SList a -> r Source #

foldrNode :: (a -> r -> r) -> Node a -> r -> r Source #

foldlM :: (r -> Node a -> r) -> r -> Mid a -> r Source #

foldlS :: (r -> a -> r) -> r -> SList a -> r Source #

foldlRev :: (r -> a -> r) -> r -> SList a -> r Source #

foldlNode :: (r -> a -> r) -> r -> Node a -> r Source #