fingertree 0.1.4.1 → 0.1.4.2
raw patch · 4 files changed
+38/−3 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.FingerTree: instance (GHC.Classes.Eq (s a), GHC.Classes.Eq a) => GHC.Classes.Eq (Data.FingerTree.ViewL s a)
- Data.FingerTree: instance (GHC.Classes.Eq (s a), GHC.Classes.Eq a) => GHC.Classes.Eq (Data.FingerTree.ViewR s a)
- Data.FingerTree: instance (GHC.Classes.Ord (s a), GHC.Classes.Ord a) => GHC.Classes.Ord (Data.FingerTree.ViewL s a)
- Data.FingerTree: instance (GHC.Classes.Ord (s a), GHC.Classes.Ord a) => GHC.Classes.Ord (Data.FingerTree.ViewR s a)
- Data.FingerTree: instance (GHC.Read.Read (s a), GHC.Read.Read a) => GHC.Read.Read (Data.FingerTree.ViewL s a)
- Data.FingerTree: instance (GHC.Read.Read (s a), GHC.Read.Read a) => GHC.Read.Read (Data.FingerTree.ViewR s a)
- Data.FingerTree: instance (GHC.Show.Show (s a), GHC.Show.Show a) => GHC.Show.Show (Data.FingerTree.ViewL s a)
- Data.FingerTree: instance (GHC.Show.Show (s a), GHC.Show.Show a) => GHC.Show.Show (Data.FingerTree.ViewR s a)
- Data.FingerTree: instance (GHC.Show.Show a, GHC.Show.Show v) => GHC.Show.Show (Data.FingerTree.Node v a)
- Data.FingerTree: instance Data.FingerTree.Measured v a => Data.Semigroup.Semigroup (Data.FingerTree.FingerTree v a)
- Data.IntervalMap.FingerTree: instance (GHC.Classes.Eq a, GHC.Classes.Eq v) => GHC.Classes.Eq (Data.IntervalMap.FingerTree.Node v a)
- Data.IntervalMap.FingerTree: instance (GHC.Classes.Ord a, GHC.Classes.Ord v) => GHC.Classes.Ord (Data.IntervalMap.FingerTree.Node v a)
- Data.IntervalMap.FingerTree: instance (GHC.Read.Read a, GHC.Read.Read v) => GHC.Read.Read (Data.IntervalMap.FingerTree.Node v a)
- Data.IntervalMap.FingerTree: instance (GHC.Show.Show a, GHC.Show.Show v) => GHC.Show.Show (Data.IntervalMap.FingerTree.Node v a)
- Data.IntervalMap.FingerTree: instance GHC.Classes.Ord v => Data.Semigroup.Semigroup (Data.IntervalMap.FingerTree.IntInterval v)
- Data.IntervalMap.FingerTree: instance GHC.Classes.Ord v => Data.Semigroup.Semigroup (Data.IntervalMap.FingerTree.IntervalMap v a)
- Data.PriorityQueue.FingerTree: instance GHC.Classes.Ord k => Data.Semigroup.Semigroup (Data.PriorityQueue.FingerTree.PQueue k v)
- Data.PriorityQueue.FingerTree: instance GHC.Classes.Ord k => Data.Semigroup.Semigroup (Data.PriorityQueue.FingerTree.Prio k v)
+ Data.FingerTree: instance (GHC.Classes.Eq a, GHC.Classes.Eq (s a)) => GHC.Classes.Eq (Data.FingerTree.ViewL s a)
+ Data.FingerTree: instance (GHC.Classes.Eq a, GHC.Classes.Eq (s a)) => GHC.Classes.Eq (Data.FingerTree.ViewR s a)
+ Data.FingerTree: instance (GHC.Classes.Ord a, GHC.Classes.Ord (s a)) => GHC.Classes.Ord (Data.FingerTree.ViewL s a)
+ Data.FingerTree: instance (GHC.Classes.Ord a, GHC.Classes.Ord (s a)) => GHC.Classes.Ord (Data.FingerTree.ViewR s a)
+ Data.FingerTree: instance (GHC.Read.Read a, GHC.Read.Read (s a)) => GHC.Read.Read (Data.FingerTree.ViewL s a)
+ Data.FingerTree: instance (GHC.Read.Read a, GHC.Read.Read (s a)) => GHC.Read.Read (Data.FingerTree.ViewR s a)
+ Data.FingerTree: instance (GHC.Show.Show a, GHC.Show.Show (s a)) => GHC.Show.Show (Data.FingerTree.ViewL s a)
+ Data.FingerTree: instance (GHC.Show.Show a, GHC.Show.Show (s a)) => GHC.Show.Show (Data.FingerTree.ViewR s a)
+ Data.FingerTree: instance (GHC.Show.Show v, GHC.Show.Show a) => GHC.Show.Show (Data.FingerTree.Node v a)
+ Data.FingerTree: instance Data.FingerTree.Measured v a => GHC.Base.Semigroup (Data.FingerTree.FingerTree v a)
+ Data.IntervalMap.FingerTree: instance (GHC.Classes.Eq v, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.IntervalMap.FingerTree.Node v a)
+ Data.IntervalMap.FingerTree: instance (GHC.Classes.Ord v, GHC.Classes.Ord a) => GHC.Classes.Ord (Data.IntervalMap.FingerTree.Node v a)
+ Data.IntervalMap.FingerTree: instance (GHC.Read.Read v, GHC.Read.Read a) => GHC.Read.Read (Data.IntervalMap.FingerTree.Node v a)
+ Data.IntervalMap.FingerTree: instance (GHC.Show.Show v, GHC.Show.Show a) => GHC.Show.Show (Data.IntervalMap.FingerTree.Node v a)
+ Data.IntervalMap.FingerTree: instance GHC.Classes.Ord v => GHC.Base.Semigroup (Data.IntervalMap.FingerTree.IntInterval v)
+ Data.IntervalMap.FingerTree: instance GHC.Classes.Ord v => GHC.Base.Semigroup (Data.IntervalMap.FingerTree.IntervalMap v a)
+ Data.PriorityQueue.FingerTree: instance GHC.Classes.Ord k => GHC.Base.Semigroup (Data.PriorityQueue.FingerTree.PQueue k v)
+ Data.PriorityQueue.FingerTree: instance GHC.Classes.Ord k => GHC.Base.Semigroup (Data.PriorityQueue.FingerTree.Prio k v)
- Data.FingerTree: (<|) :: (Measured v a) => a -> FingerTree v a -> FingerTree v a
+ Data.FingerTree: (<|) :: Measured v a => a -> FingerTree v a -> FingerTree v a
- Data.FingerTree: (><) :: (Measured v a) => FingerTree v a -> FingerTree v a -> FingerTree v a
+ Data.FingerTree: (><) :: Measured v a => FingerTree v a -> FingerTree v a -> FingerTree v a
- Data.FingerTree: (|>) :: (Measured v a) => FingerTree v a -> a -> FingerTree v a
+ Data.FingerTree: (|>) :: Measured v a => FingerTree v a -> a -> FingerTree v a
- Data.FingerTree: Position :: (FingerTree v a) -> a -> (FingerTree v a) -> SearchResult v a
+ Data.FingerTree: Position :: FingerTree v a -> a -> FingerTree v a -> SearchResult v a
- Data.FingerTree: dropUntil :: (Measured v a) => (v -> Bool) -> FingerTree v a -> FingerTree v a
+ Data.FingerTree: dropUntil :: Measured v a => (v -> Bool) -> FingerTree v a -> FingerTree v a
- Data.FingerTree: fromList :: (Measured v a) => [a] -> FingerTree v a
+ Data.FingerTree: fromList :: Measured v a => [a] -> FingerTree v a
- Data.FingerTree: infixl 5 |>
+ Data.FingerTree: infixl 5 :>
- Data.FingerTree: infixr 5 ><
+ Data.FingerTree: infixr 5 :<
- Data.FingerTree: reverse :: (Measured v a) => FingerTree v a -> FingerTree v a
+ Data.FingerTree: reverse :: Measured v a => FingerTree v a -> FingerTree v a
- Data.FingerTree: search :: (Measured v a) => (v -> v -> Bool) -> FingerTree v a -> SearchResult v a
+ Data.FingerTree: search :: Measured v a => (v -> v -> Bool) -> FingerTree v a -> SearchResult v a
- Data.FingerTree: split :: (Measured v a) => (v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
+ Data.FingerTree: split :: Measured v a => (v -> Bool) -> FingerTree v a -> (FingerTree v a, FingerTree v a)
- Data.FingerTree: takeUntil :: (Measured v a) => (v -> Bool) -> FingerTree v a -> FingerTree v a
+ Data.FingerTree: takeUntil :: Measured v a => (v -> Bool) -> FingerTree v a -> FingerTree v a
- Data.FingerTree: unsafeTraverse :: (Applicative f) => (a -> f b) -> FingerTree v a -> f (FingerTree v b)
+ Data.FingerTree: unsafeTraverse :: Applicative f => (a -> f b) -> FingerTree v a -> f (FingerTree v b)
- Data.FingerTree: viewl :: (Measured v a) => FingerTree v a -> ViewL (FingerTree v) a
+ Data.FingerTree: viewl :: Measured v a => FingerTree v a -> ViewL (FingerTree v) a
- Data.FingerTree: viewr :: (Measured v a) => FingerTree v a -> ViewR (FingerTree v) a
+ Data.FingerTree: viewr :: Measured v a => FingerTree v a -> ViewR (FingerTree v) a
- Data.IntervalMap.FingerTree: bounds :: (Ord v) => IntervalMap v a -> Maybe (Interval v)
+ Data.IntervalMap.FingerTree: bounds :: Ord v => IntervalMap v a -> Maybe (Interval v)
- Data.IntervalMap.FingerTree: dominators :: (Ord v) => Interval v -> IntervalMap v a -> [(Interval v, a)]
+ Data.IntervalMap.FingerTree: dominators :: Ord v => Interval v -> IntervalMap v a -> [(Interval v, a)]
- Data.IntervalMap.FingerTree: empty :: (Ord v) => IntervalMap v a
+ Data.IntervalMap.FingerTree: empty :: Ord v => IntervalMap v a
- Data.IntervalMap.FingerTree: insert :: (Ord v) => Interval v -> a -> IntervalMap v a -> IntervalMap v a
+ Data.IntervalMap.FingerTree: insert :: Ord v => Interval v -> a -> IntervalMap v a -> IntervalMap v a
- Data.IntervalMap.FingerTree: intersections :: (Ord v) => Interval v -> IntervalMap v a -> [(Interval v, a)]
+ Data.IntervalMap.FingerTree: intersections :: Ord v => Interval v -> IntervalMap v a -> [(Interval v, a)]
- Data.IntervalMap.FingerTree: search :: (Ord v) => v -> IntervalMap v a -> [(Interval v, a)]
+ Data.IntervalMap.FingerTree: search :: Ord v => v -> IntervalMap v a -> [(Interval v, a)]
- Data.IntervalMap.FingerTree: singleton :: (Ord v) => Interval v -> a -> IntervalMap v a
+ Data.IntervalMap.FingerTree: singleton :: Ord v => Interval v -> a -> IntervalMap v a
- Data.IntervalMap.FingerTree: union :: (Ord v) => IntervalMap v a -> IntervalMap v a -> IntervalMap v a
+ Data.IntervalMap.FingerTree: union :: Ord v => IntervalMap v a -> IntervalMap v a -> IntervalMap v a
Files
- Data/FingerTree.hs +1/−1
- changelog +3/−0
- fingertree.cabal +2/−2
- tests/ft-properties.hs +32/−0
Data/FingerTree.hs view
@@ -966,7 +966,7 @@ | p vlpm vsr = let Split ml xs mr = searchTree p vlp m vsr Split l x r = searchNode p (vlp `mappend` measure ml) xs (measure mr `mappend` vsr) in Split (deepR pr ml l) x (deepL r mr sf)- | otherwise = let Split l x r = searchDigit p vm sf vr+ | otherwise = let Split l x r = searchDigit p vlpm sf vr in Split (deepR pr m l) x (maybe Empty digitToTree r) where vlp = vl `mappend` measure pr
changelog view
@@ -1,5 +1,8 @@ -*-change-log-*- +0.1.4.2 Ross Paterson <R.Paterson@city.ac.uk> Dec 2018+ * Fixed bug in search+ 0.1.4.1 Ross Paterson <R.Paterson@city.ac.uk> Mar 2018 * Disabled Generic instances for GHC <= 7.6
fingertree.cabal view
@@ -1,6 +1,6 @@ Name: fingertree-Version: 0.1.4.1-Cabal-Version: >= 1.18+Version: 0.1.4.2+Cabal-Version: 1.18 Copyright: (c) 2006 Ross Paterson, Ralf Hinze License: BSD3 License-File: LICENSE
tests/ft-properties.hs view
@@ -22,6 +22,7 @@ import Data.Functor ((<$>)) import Data.Traversable (traverse) import Data.List (inits)+import Data.Maybe (listToMaybe) import Data.Monoid (Monoid(..)) main :: IO ()@@ -40,6 +41,8 @@ , testProperty "null" prop_null , testProperty "viewl" prop_viewl , testProperty "viewr" prop_viewr+ , testCase "search" test_search+ , testProperty "search" prop_search , testProperty "split" prop_split , testProperty "takeUntil" prop_takeUntil , testProperty "dropUntil" prop_dropUntil@@ -153,6 +156,35 @@ case viewr xs of EmptyR -> Prelude.null (toList xs) xs' :> x -> valid xs' && toList xs == toList xs' ++ [x]++prop_search :: Int -> Seq A -> Bool+prop_search n xs =+ case search p xs of+ Position _ b _ -> Just b == indexFromEnd n (toList xs)+ OnLeft -> n >= len || null xs+ OnRight -> n < 0+ Nowhere -> error "impossible: the predicate is monotonic"+ where p vl vr = Prelude.length vl >= len - n && Prelude.length vr <= n++ len = length xs++ indexFromEnd :: Int -> [a] -> Maybe a+ indexFromEnd i = listToMaybe . drop i . Prelude.reverse+++test_search :: Assertion+test_search = do+ lookupByIndexFromEnd xs1 1 @?= Just (A 4)+ lookupByIndexFromEnd xs2 1 @?= Just (A 4)+ where+ xs1 = Deep (map A [1..5]) (Four (A 1) (A 2) (A 3) (A 4)) Empty (One (A 5))+ xs2 = Deep (map A [1..5]) (One (A 1)) Empty (Four (A 2) (A 3) (A 4) (A 5))+ lookupByIndexFromEnd xs n =+ let len = length xs+ p vl vr = Prelude.length vl >= len - n && Prelude.length vr <= n+ in case search p xs of+ Position _ x _ -> Just x+ _ -> Nothing prop_split :: Int -> Seq A -> Bool prop_split n xs =