interval-patterns 0.1.0.0 → 0.2.0.0
raw patch · 3 files changed
+19/−15 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.Timeframe: instance GHC.Classes.Eq ev => GHC.Classes.Eq (Data.Timeframe.Calendar ev)
- Data.Timeframe: instance GHC.Classes.Ord ev => GHC.Base.Monoid (Data.Timeframe.Calendar ev)
- Data.Timeframe: instance GHC.Classes.Ord ev => GHC.Base.Semigroup (Data.Timeframe.Calendar ev)
- Data.Timeframe: instance GHC.Classes.Ord ev => GHC.Classes.Ord (Data.Timeframe.Calendar ev)
- Data.Timeframe: instance GHC.Show.Show ev => GHC.Show.Show (Data.Timeframe.Calendar ev)
+ Data.Timeframe: instance (GHC.Classes.Eq ev, GHC.Classes.Eq n) => GHC.Classes.Eq (Data.Timeframe.Calendar ev n)
+ Data.Timeframe: instance (GHC.Classes.Ord ev, GHC.Classes.Ord n) => GHC.Classes.Ord (Data.Timeframe.Calendar ev n)
+ Data.Timeframe: instance (GHC.Classes.Ord ev, GHC.Num.Num n) => GHC.Base.Monoid (Data.Timeframe.Calendar ev n)
+ Data.Timeframe: instance (GHC.Classes.Ord ev, GHC.Num.Num n) => GHC.Base.Semigroup (Data.Timeframe.Calendar ev n)
+ Data.Timeframe: instance (GHC.Show.Show ev, GHC.Show.Show n) => GHC.Show.Show (Data.Timeframe.Calendar ev n)
- Data.Timeframe: Calendar :: Map ev Event -> Calendar ev
+ Data.Timeframe: Calendar :: Map ev (Event n) -> Calendar ev n
- Data.Timeframe: [getCalendar] :: Calendar ev -> Map ev Event
+ Data.Timeframe: [getCalendar] :: Calendar ev n -> Map ev (Event n)
- Data.Timeframe: addEvent :: Ord ev => ev -> Event -> Calendar ev -> Calendar ev
+ Data.Timeframe: addEvent :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n -> Calendar ev n
- Data.Timeframe: calendar :: Ord ev => ev -> Timeframe -> Calendar ev
+ Data.Timeframe: calendar :: (Ord ev, Num n) => ev -> Timeframe -> Calendar ev n
- Data.Timeframe: event :: Timeframe -> Event
+ Data.Timeframe: event :: Num n => Timeframe -> Event n
- Data.Timeframe: newtype Calendar ev
+ Data.Timeframe: newtype Calendar ev n
- Data.Timeframe: singleton :: Ord ev => ev -> Event -> Calendar ev
+ Data.Timeframe: singleton :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n
- Data.Timeframe: totalDuration :: Ord ev => ev -> Calendar ev -> Maybe NominalDiffTime
+ Data.Timeframe: totalDuration :: forall ev n. (Ord ev, Real n) => ev -> Calendar ev n -> Maybe NominalDiffTime
- Data.Timeframe: type Event = Layers UTCTime (Sum Int)
+ Data.Timeframe: type Event n = Layers UTCTime (Sum n)
Files
- CHANGELOG.md +4/−0
- interval-patterns.cabal +3/−3
- src/Data/Timeframe.hs +12/−12
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for interval-patterns +## 0.2.0.0 - 2022-05-30++* generalize `Layers` to arbitrary `Num` types and `Calendar` to arbitrary `Real` types+ ## 0.1.0.0 - 2022-05-19 * constructors behave more intuitively
interval-patterns.cabal view
@@ -1,13 +1,13 @@ cabal-version: 3.0 name: interval-patterns-version: 0.1.0.0+version: 0.2.0.0 author: Melanie Brown description: A library for easy manipulation of intervals according to their overlap. maintainer: brown.m@pm.me license: BSD-3-Clause license-file: LICENSE-homepage: https://github.com/cigsender/interval-patterns-bug-reports: https://github.com/cigsender/interval-patterns/issues+homepage: https://github.com/mixphix/interval-patterns+bug-reports: https://github.com/mixphix/interval-patterns/issues extra-source-files: CHANGELOG.md copyright: 2022 Melanie Brown
src/Data/Timeframe.hs view
@@ -41,37 +41,37 @@ -- | An 'Event' is something that happens for a period of time. ----- > type Event = Layers UTCTime-type Event = Layers UTCTime (Sum Int)+-- > type Event n = Layers UTCTime (Sum n)+type Event n = Layers UTCTime (Sum n) -event :: Timeframe -> Event+event :: (Num n) => Timeframe -> Event n event = (`Layers.singleton` 1) -newtype Calendar ev = Calendar {getCalendar :: Map ev Event}+newtype Calendar ev n = Calendar {getCalendar :: Map ev (Event n)} deriving (Eq, Ord, Show, Typeable) -instance (Ord ev) => Semigroup (Calendar ev) where+instance (Ord ev, Num n) => Semigroup (Calendar ev n) where Calendar a <> Calendar b = Calendar (Map.unionWith (<>) a b) -instance (Ord ev) => Monoid (Calendar ev) where+instance (Ord ev, Num n) => Monoid (Calendar ev n) where mempty = Calendar mempty -singleton :: (Ord ev) => ev -> Event -> Calendar ev+singleton :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n singleton ev cvg = Calendar (Map.singleton ev cvg) -calendar :: (Ord ev) => ev -> Timeframe -> Calendar ev+calendar :: (Ord ev, Num n) => ev -> Timeframe -> Calendar ev n calendar ev tf = singleton ev (Layers.singleton tf 1) -addEvent :: (Ord ev) => ev -> Event -> Calendar ev -> Calendar ev+addEvent :: (Ord ev, Num n) => ev -> Event n -> Calendar ev n -> Calendar ev n addEvent ev cvg (Calendar c) = Calendar (Map.insertWith (<>) ev cvg c) -totalDuration :: (Ord ev) => ev -> Calendar ev -> Maybe NominalDiffTime+totalDuration :: forall ev n. (Ord ev, Real n) => ev -> Calendar ev n -> Maybe NominalDiffTime totalDuration ev (Calendar c) = case c Map.!? ev of Nothing -> Just 0 Just is -> foldr f (Just 0) (Layers.toList is) where- f :: (Timeframe, Sum Int) -> Maybe NominalDiffTime -> Maybe NominalDiffTime+ f :: (Timeframe, Sum n) -> Maybe NominalDiffTime -> Maybe NominalDiffTime f _ Nothing = Nothing- f (tf, Sum n) (Just x) = case (fromIntegral n *) <$> duration tf of+ f (tf, Sum n) (Just x) = case (realToFrac n *) <$> duration tf of Nothing -> Nothing Just y -> Just (x + y)