packages feed

IntervalMap 0.6.2.1 → 0.6.2.3

raw patch · 5 files changed

+17/−98 lines, 5 filesdep −SegmentTreePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: SegmentTree

API changes (from Hackage documentation)

- Data.IntervalMap.Lazy: type IntervalMap k v = IntervalMap (Interval k) v
+ Data.IntervalMap.Lazy: type IntervalMap k v = IntervalMap Interval k v
- Data.IntervalMap.Strict: type IntervalMap k v = IntervalMap (Interval k) v
+ Data.IntervalMap.Strict: type IntervalMap k v = IntervalMap Interval k v

Files

IntervalMap.cabal view
@@ -1,18 +1,18 @@ Name:                IntervalMap-Version:             0.6.2.1+Version:             0.6.2.3 Stability:           experimental Synopsis:            Containers for intervals, with efficient search.-Homepage:            http://www.chr-breitkopf.de/comp/IntervalMap+Homepage:            https://www.chr-breitkopf.de/comp/IntervalMap License:             BSD3 License-file:        LICENSE Author:              Christoph Breitkopf Maintainer:          Christoph Breitkopf <chbreitkopf@gmail.com> bug-reports:         mailto:chbreitkopf@gmail.com-Copyright:           2011-2020 Christoph Breitkopf+Copyright:           2011-2026 Christoph Breitkopf Category:            Data Build-type:          Simple Cabal-version:       >= 1.10-Tested-With:         GHC ==8.0.2, GHC ==8.2.1, GHC ==8.4.1, GHC ==8.6.5, GHC ==8.8.3, GHC ==9.0.2+Tested-With:         GHC ==8.0.2, GHC ==8.2.1, GHC ==8.4.1, GHC ==8.6.5, GHC ==8.8.3, GHC ==9.0.2, GHC ==9.6.7 Description:                      Ordered containers of intervals, with efficient search                      for all keys containing a point or overlapping an interval.@@ -119,7 +119,7 @@   hs-source-dirs:     . bench   main-is:            CompareTypes.hs   Build-depends:      base >= 4 && < 5,-                      containers, random, deepseq, fingertree >= 0.1, SegmentTree,+                      containers, random, deepseq, fingertree >= 0.1,                       criterion >= 1.0   default-language:    Haskell2010   ghc-options: -Wall
README.md view
@@ -1,10 +1,10 @@-# IntervalMap [![Hackage](https://img.shields.io/hackage/v/IntervalMap.svg)](https://hackage.haskell.org/package/IntervalMap) [![Build Status](https://travis-ci.org/bokesan/IntervalMap.svg?branch=master)](https://travis-ci.org/bokesan/IntervalMap)+# IntervalMap [![Hackage](https://img.shields.io/hackage/v/IntervalMap.svg)](https://hackage.haskell.org/package/IntervalMap) ![Continuous Integration](https://github.com/bokesan/IntervalMap/actions/workflows/ci.yml/badge.svg)  Containers for intervals. Like `Data.Set` and `Data.Map` with Intervals as keys and functions for efficiently getting the subset of all intervals containing a point, intersecting an interval, and more. -Home page and documentation: [http://www.chr-breitkopf.de/comp/IntervalMap/index.html](http://www.chr-breitkopf.de/comp/IntervalMap/index.html)+Home page and documentation: [https://www.chr-breitkopf.de/comp/IntervalMap/index.html](https://www.chr-breitkopf.de/comp/IntervalMap/index.html)  ## Getting started 
bench/CompareTypes.hs view
@@ -15,45 +15,15 @@ import qualified Data.IntervalMap.Generic.Strict as RB import qualified IvMapSortedList as SL import qualified Data.IntervalMap.FingerTree as FT-import qualified Data.SegmentTree as ST   instance Ord a => Interval (FT.Interval a) a where   lowerBound = FT.low   upperBound = FT.high -instance Ord a => Interval (ST.Interval a) a where-  lowerBound (ST.Interval _ (ST.R a) _ _) = a-  lowerBound _ = error "interval lower"-  upperBound (ST.Interval _ _ (ST.R a) _) = a-  upperBound _ = error "interval upper"---instance NFData a => NFData (FT.Interval a) where-  rnf (FT.Interval a b) = a `deepseq` b `deepseq` ()--instance NFData a => NFData (ST.Interval a) where-  rnf (ST.Interval _ (ST.R a) (ST.R b) _) = a `deepseq` b `deepseq` ()-  rnf a = a `seq` ()--instance (NFData k, NFData v) => NFData (FT.IntervalMap k v) where-  -- FIXME-  rnf a = a `seq` ()--instance NFData v => NFData (ST.STree v Int) where-  rnf (ST.Leaf a b) = a `deepseq` b `deepseq`()-  rnf (ST.Branch a b c d) = a `deepseq` b `deepseq` c `deepseq` d `deepseq` ()- ftFromList :: Ord k => [(FT.Interval k, v)] -> FT.IntervalMap k v ftFromList =  foldr (\(k,v) m -> FT.insert k v m) FT.empty -stFromList :: [(Int,Int)] -> ST.STree [ST.Interval Int] Int-stFromList = ST.fromList--stLoBound :: ST.Interval Int -> Int-stLoBound (ST.Interval{ST.low=(ST.R v)}) = v-stLoBound _ = error "stLoBound"- cSEED, cSEED2 :: Int cSEED  = 54321 cSEED2 = 12345@@ -103,15 +73,7 @@   where    toIv (IntRange a b) = FT.Interval a b -stEnv :: Int -> IO ([ST.Interval Int], ST.STree [ST.Interval Int] Int)-stEnv n = do-   let ivs  = genRandomIntervals n 20 n-   let ivsFt = [(lo,hi) | (IntRange lo hi) <- nub ivs]-   return (map toIv (mkKeys n), stFromList ivsFt)-  where-   toIv (IntRange a b) = ST.Interval ST.Closed (ST.R a) (ST.R b) ST.Closed - runInsert :: Interval k a => (k -> a -> m -> m) -> m -> [k] -> m runInsert ins m keys = foldr (\k mp -> ins k (lowerBound k) mp) m keys @@ -139,58 +101,43 @@     bench "containing"  $ nf (\ks -> sum [v | k <- ks, (_,v) <- FT.search (FT.low k) m]) keys   ] -benchST :: ([ST.Interval Int], ST.STree [ST.Interval Int] Int) -> Benchmark-benchST ~(keys,m) = bgroup "SegmentTree" [-    bench "insert"      $ whnf (runInsert (\k _ mp -> ST.insert mp k) m) keys,-    bench "containing"  $ nf (\ks -> sum [stLoBound v | k <- ks, v <- ST.stabbingQuery m (stLoBound k)]) keys-  ] -- main :: IO () main = defaultMainWith benchConfig [         bgroup "10" [            env (slEnv 10) benchSL,            env (rbEnv 10) benchRB,-           env (ftEnv 10) benchFT,-           env (stEnv 10) benchST+           env (ftEnv 10) benchFT          ],          bgroup "100" [            env (slEnv 100) benchSL,            env (rbEnv 100) benchRB,-           env (ftEnv 100) benchFT,-           env (stEnv 100) benchST+           env (ftEnv 100) benchFT          ],          bgroup "1000" [            env (slEnv 1000) benchSL,            env (rbEnv 1000) benchRB,-           env (ftEnv 1000) benchFT,-           env (stEnv 1000) benchST+           env (ftEnv 1000) benchFT          ],          bgroup "2500" [            env (slEnv 2500) benchSL,            env (rbEnv 2500) benchRB,-           env (ftEnv 2500) benchFT,-           env (stEnv 2500) benchST+           env (ftEnv 2500) benchFT          ],          bgroup "10000" [            env (rbEnv 10000) benchRB,-           env (ftEnv 10000) benchFT,-           env (stEnv 10000) benchST+           env (ftEnv 10000) benchFT          ],          bgroup "20000" [            env (rbEnv 20000) benchRB,-           env (ftEnv 20000) benchFT,-           env (stEnv 20000) benchST+           env (ftEnv 20000) benchFT          ],          bgroup "50000" [            env (rbEnv 50000) benchRB,-           env (ftEnv 50000) benchFT,-           env (stEnv 50000) benchST+           env (ftEnv 50000) benchFT          ],          bgroup "100000" [            env (rbEnv 100000) benchRB,-           env (ftEnv 100000) benchFT,-           env (stEnv 100000) benchST+           env (ftEnv 100000) benchFT          ]        ]
changelog view
@@ -1,3 +1,5 @@+0.6.2.3  Fix benchmark broken by fingertree adding its own NFData instance+0.6.2.2  Remove SegmentTree from benchmarks because it does not compile with current ghc/cabal 0.6.2.1  Future-proof against potential Prelude.foldl' 0.6.2.0  Bugfix: Interval.overlaps could be true for empty intervals 0.6.1.3  Remove unneeded languages pragmas.
− examples/GetttingStarted.lhs
@@ -1,30 +0,0 @@-You need some language extensions to be able to-define Interval Instances:--> {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}--In most cases, you should use the value-strict version:--> import qualified Data.IntervalMap.Generic.Strict as IM--Make tuples an instance of Interval:--> instance Ord e => IM.Interval (e,e) e where->   lowerBound (a,_) = a->   upperBound (_,b) = b->   rightClosed _ = False--By using `rightClosed _ = False` we have defined tuples to be half-open-intervals - they include the starting value, but not the end value.--Now we can put them into a Map:--> type MyMap = IM.IntervalMap (Int,Int) String->-> sample :: MyMap-> sample = IM.fromList [((1,6), "Foo"), ((2,4), "Bar"), ((4,7), "Baz")]--Lookup intervals containing a given point ("stabbing query"):--> main = print (IM.toAscList $ sample `IM.containing` 3)-