hw-fingertree-strict 0.1.0.0 → 0.1.0.1
raw patch · 4 files changed
+62/−29 lines, 4 filesdep +semigroupsdep ~basePVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependencies added: semigroups
Dependency ranges changed: base
API changes (from Hackage documentation)
+ HaskellWorks.Data.FingerTree.Strict: instance HaskellWorks.Data.FingerTree.Strict.Measured v a => Data.Semigroup.Semigroup (HaskellWorks.Data.FingerTree.Strict.FingerTree v a)
+ HaskellWorks.Data.IntervalMap.Strict: instance GHC.Classes.Ord v => Data.Semigroup.Semigroup (HaskellWorks.Data.IntervalMap.Strict.IntInterval v)
+ HaskellWorks.Data.IntervalMap.Strict: instance GHC.Classes.Ord v => Data.Semigroup.Semigroup (HaskellWorks.Data.IntervalMap.Strict.IntervalMap v a)
+ HaskellWorks.Data.PriorityQueue.Strict: instance GHC.Classes.Ord k => Data.Semigroup.Semigroup (HaskellWorks.Data.PriorityQueue.Strict.PQueue k v)
+ HaskellWorks.Data.PriorityQueue.Strict: instance GHC.Classes.Ord k => Data.Semigroup.Semigroup (HaskellWorks.Data.PriorityQueue.Strict.Prio k v)
Files
- hw-fingertree-strict.cabal +3/−1
- src/HaskellWorks/Data/FingerTree/Strict.hs +10/−2
- src/HaskellWorks/Data/IntervalMap/Strict.hs +24/−12
- src/HaskellWorks/Data/PriorityQueue/Strict.hs +25/−14
hw-fingertree-strict.cabal view
@@ -1,5 +1,5 @@ name: hw-fingertree-strict-version: 0.1.0.0+version: 0.1.0.1 -- synopsis: -- description: homepage: https://github.com/githubuser/hw-fingertree-strict#readme@@ -39,6 +39,8 @@ , HaskellWorks.Data.Segment.Strict build-depends: base >= 4.7 && < 5 default-language: Haskell2010+ if !impl(ghc >= 8.0)+ build-depends: semigroups == 0.18.* test-suite hw-fingertree-strict-test type: exitcode-stdio-1.0
src/HaskellWorks/Data/FingerTree/Strict.hs view
@@ -68,6 +68,8 @@ import Data.Foldable (Foldable (foldMap), foldr', toList) import Data.Monoid +import qualified Data.Semigroup as S+ infixr 5 >< infixr 5 <|, :< infixl 5 |>, :>@@ -93,10 +95,16 @@ fmap _ EmptyR = EmptyR fmap f (xs :> x) = fmap f xs :> f x +instance Measured v a => S.Semigroup (FingerTree v a) where+ (<>) = (><)+ {-# INLINE (<>) #-}+ -- | 'empty' and '><'. instance Measured v a => Monoid (FingerTree v a) where- mempty = empty- mappend = (><)+ mempty = empty+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-} -- Explicit Digit type (Exercise 1)
src/HaskellWorks/Data/IntervalMap/Strict.hs view
@@ -44,14 +44,15 @@ search, intersections, dominators ) where -import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><))-import qualified HaskellWorks.Data.FingerTree.Strict as FT--import Control.Applicative ((<$>))-import Data.Foldable (Foldable (foldMap))+import Control.Applicative ((<$>))+import Data.Foldable (Foldable (foldMap)) import Data.Monoid-import Data.Traversable (Traversable (traverse))+import Data.Traversable (Traversable (traverse))+import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><)) +import qualified Data.Semigroup as S+import qualified HaskellWorks.Data.FingerTree.Strict as FT+ ---------------------------------- -- 4.8 Application: interval trees ----------------------------------@@ -79,12 +80,17 @@ -- rightmost interval (including largest lower bound) and largest upper bound. data IntInterval v = NoInterval | IntInterval !(Interval v) !v +instance Ord v => S.Semigroup (IntInterval v) where+ NoInterval <> i = i+ i <> NoInterval = i+ IntInterval _ hi1 <> IntInterval int2 hi2 = IntInterval int2 (max hi1 hi2)+ {-# INLINE (<>) #-}+ instance Ord v => Monoid (IntInterval v) where- mempty = NoInterval- NoInterval `mappend` i = i- i `mappend` NoInterval = i- IntInterval _ hi1 `mappend` IntInterval int2 hi2 =- IntInterval int2 (max hi1 hi2)+ mempty = NoInterval+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-} instance (Ord v) => Measured (IntInterval v) (Node v a) where measure (Node i _) = IntInterval i (high i)@@ -106,10 +112,16 @@ traverse f (IntervalMap t) = IntervalMap <$> FT.unsafeTraverse (traverse f) t +instance (Ord v) => S.Semigroup (IntervalMap v a) where+ (<>) = union+ {-# INLINE (<>) #-}+ -- | 'empty' and 'union'. instance (Ord v) => Monoid (IntervalMap v a) where mempty = empty- mappend = union+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-} -- | /O(1)/. The empty interval map. empty :: (Ord v) => IntervalMap v a
src/HaskellWorks/Data/PriorityQueue/Strict.hs view
@@ -54,14 +54,15 @@ minViewWithKey ) where -import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><), (|>))-import qualified HaskellWorks.Data.FingerTree.Strict as FT--import Control.Arrow ((***))-import Data.Foldable (Foldable (foldMap))+import Control.Arrow ((***))+import Data.Foldable (Foldable (foldMap)) import Data.Monoid-import Prelude hiding (null)+import HaskellWorks.Data.FingerTree.Strict (FingerTree, Measured (..), ViewL (..), (<|), (><), (|>))+import Prelude hiding (null) +import qualified Data.Semigroup as S+import qualified HaskellWorks.Data.FingerTree.Strict as FT+ data Entry k v = Entry k v instance Functor (Entry k) where@@ -72,13 +73,17 @@ data Prio k v = NoPrio | Prio k v +instance Ord k => S.Semigroup (Prio k v) where+ x <> NoPrio = x+ NoPrio <> y = y+ x@(Prio kx _) <> y@(Prio ky _) = if kx <= ky then x else y+ {-# INLINE (<>) #-}+ instance Ord k => Monoid (Prio k v) where- mempty = NoPrio- x `mappend` NoPrio = x- NoPrio `mappend` y = y- x@(Prio kx _) `mappend` y@(Prio ky _)- | kx <= ky = x- | otherwise = y+ mempty = NoPrio+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-} instance Ord k => Measured (Prio k v) (Entry k v) where measure (Entry k v) = Prio k v@@ -94,9 +99,15 @@ Nothing -> mempty Just (v, q') -> f v `mappend` foldMap f q' +instance Ord k => S.Semigroup (PQueue k v) where+ (<>) = union+ {-# INLINE (<>) #-}+ instance Ord k => Monoid (PQueue k v) where- mempty = empty- mappend = union+ mempty = empty+ {-# INLINE mempty #-}+ mappend = (<>)+ {-# INLINE mappend #-} -- | /O(1)/. The empty priority queue. empty :: Ord k => PQueue k v