nonempty-containers 0.3.3.0 → 0.3.4.0
raw patch · 8 files changed
+77/−8 lines, 8 filesdep +aesonPVP ok
version bump matches the API change (PVP)
Dependencies added: aeson
API changes (from Hackage documentation)
+ Data.Containers.NonEmpty: pattern IsNonEmpty :: HasNonEmpty s => NE s -> s
+ Data.Containers.NonEmpty: pattern IsEmpty :: HasNonEmpty s => s
+ Data.IntMap.NonEmpty: pattern IsEmpty :: IntMap a
+ Data.IntMap.NonEmpty: pattern IsNonEmpty :: NEIntMap a -> IntMap a
+ Data.IntMap.NonEmpty.Internal: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Data.IntMap.NonEmpty.Internal.NEIntMap a)
+ Data.IntMap.NonEmpty.Internal: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.IntMap.NonEmpty.Internal.NEIntMap a)
+ Data.IntSet.NonEmpty: pattern IsEmpty :: IntSet
+ Data.IntSet.NonEmpty: pattern IsNonEmpty :: NEIntSet -> IntSet
+ Data.IntSet.NonEmpty.Internal: instance Data.Aeson.Types.FromJSON.FromJSON Data.IntSet.NonEmpty.Internal.NEIntSet
+ Data.IntSet.NonEmpty.Internal: instance Data.Aeson.Types.ToJSON.ToJSON Data.IntSet.NonEmpty.Internal.NEIntSet
+ Data.Map.NonEmpty: pattern IsEmpty :: Map k a
+ Data.Map.NonEmpty: pattern IsNonEmpty :: NEMap k a -> Map k a
+ Data.Map.NonEmpty.Internal: instance (Data.Aeson.Types.FromJSON.FromJSONKey k, GHC.Classes.Ord k, Data.Aeson.Types.FromJSON.FromJSON a) => Data.Aeson.Types.FromJSON.FromJSON (Data.Map.NonEmpty.Internal.NEMap k a)
+ Data.Map.NonEmpty.Internal: instance (Data.Aeson.Types.ToJSON.ToJSONKey k, Data.Aeson.Types.ToJSON.ToJSON a) => Data.Aeson.Types.ToJSON.ToJSON (Data.Map.NonEmpty.Internal.NEMap k a)
+ Data.Sequence.NonEmpty: pattern (:||>) :: Seq a -> a -> NESeq a
+ Data.Sequence.NonEmpty: pattern IsEmpty :: Seq a
+ Data.Sequence.NonEmpty: pattern IsNonEmpty :: NESeq a -> Seq a
+ Data.Sequence.NonEmpty.Internal: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (Data.Sequence.NonEmpty.Internal.NESeq a)
+ Data.Sequence.NonEmpty.Internal: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.Sequence.NonEmpty.Internal.NESeq a)
+ Data.Sequence.NonEmpty.Internal: pattern (:||>) :: Seq a -> a -> NESeq a
+ Data.Set.NonEmpty: pattern IsEmpty :: Set a
+ Data.Set.NonEmpty: pattern IsNonEmpty :: NESet a -> Set a
+ Data.Set.NonEmpty.Internal: instance (Data.Aeson.Types.FromJSON.FromJSON a, GHC.Classes.Ord a) => Data.Aeson.Types.FromJSON.FromJSON (Data.Set.NonEmpty.Internal.NESet a)
+ Data.Set.NonEmpty.Internal: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (Data.Set.NonEmpty.Internal.NESet a)
Files
- CHANGELOG.md +9/−0
- nonempty-containers.cabal +7/−6
- src/Data/IntMap/NonEmpty/Internal.hs +13/−1
- src/Data/IntSet/NonEmpty/Internal.hs +10/−0
- src/Data/Map/NonEmpty.hs +2/−1
- src/Data/Map/NonEmpty/Internal.hs +12/−0
- src/Data/Sequence/NonEmpty/Internal.hs +14/−0
- src/Data/Set/NonEmpty/Internal.hs +10/−0
CHANGELOG.md view
@@ -1,6 +1,15 @@ Changelog ========= +Version 0.3.4.0+---------------++*August 4, 2020*++<https://github.com/mstksg/nonempty-containers/releases/tag/v0.3.4.0>++* Add `ToJSON` and `FromJSON` instances.+ Version 0.3.3.0 ---------------
nonempty-containers.cabal view
@@ -1,13 +1,13 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.31.2.+-- This file has been generated from package.yaml by hpack version 0.34.2. -- -- see: https://github.com/sol/hpack ----- hash: 99b2f1d8a05c4c65da0f4e80d7fe63f0bba58499425adb66fc50f03895929c56+-- hash: f7b111581e408abad55838cf6ef277f8e5f3fe117ec340c4ff529f0d7141da59 name: nonempty-containers-version: 0.3.3.0+version: 0.3.4.0 synopsis: Non-empty variants of containers data types, with full API description: Efficient and optimized non-empty versions of types from /containers/. Inspired by /non-empty-containers/ library, except attempting a more@@ -50,9 +50,10 @@ Paths_nonempty_containers hs-source-dirs: src- ghc-options: -Wall -Wcompat -Werror=incomplete-patterns -Wredundant-constraints+ ghc-options: -Wall -Wcompat -Wredundant-constraints build-depends:- base >=4.9 && <5+ aeson+ , base >=4.9 && <5 , comonad , containers >=0.5.9 , deepseq@@ -75,7 +76,7 @@ Paths_nonempty_containers hs-source-dirs: test- ghc-options: -Wall -Wcompat -Werror=incomplete-patterns -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N+ ghc-options: -Wall -Wcompat -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.9 && <5 , comonad
src/Data/IntMap/NonEmpty/Internal.hs view
@@ -58,6 +58,7 @@ import Control.Applicative import Control.Comonad import Control.DeepSeq+import Control.Monad import Data.Coerce import Data.Data import Data.Function@@ -69,9 +70,10 @@ import Data.Semigroup import Data.Semigroup.Foldable (Foldable1(fold1)) import Data.Semigroup.Traversable (Traversable1(..))-import Data.Typeable (Typeable)+-- import Data.Typeable (Typeable) import Prelude hiding (foldr1, foldl1, foldr, foldl, map) import Text.Read+import qualified Data.Aeson as A import qualified Data.Foldable as F import qualified Data.IntMap as M import qualified Data.List as L@@ -186,6 +188,16 @@ intMapDataType :: DataType intMapDataType = mkDataType "Data.IntMap.NonEmpty.Internal.NEIntMap" [fromListConstr]++instance A.ToJSON a => A.ToJSON (NEIntMap a) where+ toJSON = A.toJSON . toMap+ toEncoding = A.toEncoding . toMap++instance A.FromJSON a => A.FromJSON (NEIntMap a) where+ parseJSON = withNonEmpty (fail err) pure+ <=< A.parseJSON+ where+ err = "NEIntMap: Non-empty map expected, but empty map found" -- | /O(n)/. Fold the values in the map using the given right-associative -- binary operator, such that @'foldr' f z == 'Prelude.foldr' f z . 'elems'@.
src/Data/IntSet/NonEmpty/Internal.hs view
@@ -33,6 +33,7 @@ ) where import Control.DeepSeq+import Control.Monad import Data.Data import Data.Function import Data.IntSet.Internal (IntSet(..), Key)@@ -40,6 +41,7 @@ import Data.Semigroup import Data.Semigroup.Foldable (Foldable1) import Text.Read+import qualified Data.Aeson as A import qualified Data.Foldable as F import qualified Data.IntSet as S import qualified Data.Semigroup.Foldable as F1@@ -130,7 +132,15 @@ intSetDataType = mkDataType "Data.IntSet.NonEmpty.Internal.NEIntSet" [fromListConstr] +instance A.ToJSON NEIntSet where+ toJSON = A.toJSON . toSet+ toEncoding = A.toEncoding . toSet +instance A.FromJSON NEIntSet where+ parseJSON = withNonEmpty (fail err) pure+ <=< A.parseJSON+ where+ err = "NEIntSet: Non-empty set expected, but empty set found" -- | /O(log n)/. Smart constructor for an 'NEIntSet' from a 'IntSet'. Returns
src/Data/Map/NonEmpty.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE EmptyCase #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE TupleSections #-}@@ -2349,7 +2350,7 @@ -- -- @since 0.3.1.0 absurdNEMap :: NEMap Void a -> b-absurdNEMap (NEMap k _ _) = absurd k+absurdNEMap = \case {} -- --------------------------- -- Combining functions
src/Data/Map/NonEmpty/Internal.hs view
@@ -53,6 +53,7 @@ import Control.Applicative import Control.Comonad import Control.DeepSeq+import Control.Monad import Data.Coerce import Data.Data import Data.Function@@ -66,6 +67,7 @@ import Data.Semigroup.Traversable (Traversable1(..)) import Prelude hiding (foldr1, foldl1, foldr, foldl, map) import Text.Read+import qualified Data.Aeson as A import qualified Data.Foldable as F import qualified Data.Map as M import qualified Data.Map.Internal as M@@ -187,6 +189,16 @@ mapDataType :: DataType mapDataType = mkDataType "Data.Map.NonEmpty.NonEmpty.Internal.NEMap" [fromListConstr]++instance (A.ToJSONKey k, A.ToJSON a) => A.ToJSON (NEMap k a) where+ toJSON = A.toJSON . toMap+ toEncoding = A.toEncoding . toMap++instance (A.FromJSONKey k, Ord k, A.FromJSON a) => A.FromJSON (NEMap k a) where+ parseJSON = withNonEmpty (fail err) pure+ <=< A.parseJSON+ where+ err = "NEMap: Non-empty map expected, but empty map found" -- | /O(n)/. Fold the values in the map using the given right-associative -- binary operator, such that @'foldr' f z == 'Prelude.foldr' f z . 'elems'@.
src/Data/Sequence/NonEmpty/Internal.hs view
@@ -48,6 +48,7 @@ import Control.Comonad import Control.DeepSeq+import Control.Monad import Control.Monad.Fix import Control.Monad.Zip import Data.Bifunctor@@ -64,6 +65,7 @@ import Data.Sequence (Seq(..)) import Prelude hiding (length, zipWith, unzip, zip, map, replicate) import Text.Read+import qualified Data.Aeson as A import qualified Data.Foldable as F import qualified Data.Sequence as Seq @@ -187,6 +189,18 @@ seqDataType :: DataType seqDataType = mkDataType "Data.Sequence.NonEmpty.Internal.NESeq" [consConstr]+++instance A.ToJSON a => A.ToJSON (NESeq a) where+ toJSON = A.toJSON . toSeq+ toEncoding = A.toEncoding . toSeq++instance A.FromJSON a => A.FromJSON (NESeq a) where+ parseJSON = withNonEmpty (fail err) pure+ <=< A.parseJSON+ where+ err = "NESeq: Non-empty sequence expected, but empty sequence found"+ -- | /O(log n)/. A general continuation-based way to consume a 'Seq' as if -- it were an 'NESeq'. @'withNonEmpty' def f@ will take a 'Seq'. If map is
src/Data/Set/NonEmpty/Internal.hs view
@@ -44,6 +44,7 @@ ) where import Control.DeepSeq+import Control.Monad import Data.Data import Data.Function import Data.Functor.Classes@@ -53,6 +54,7 @@ import Data.Set.Internal (Set(..)) import Prelude hiding (foldr, foldr1, foldl, foldl1) import Text.Read+import qualified Data.Aeson as A import qualified Data.Foldable as F import qualified Data.Semigroup.Foldable as F1 import qualified Data.Set as S@@ -160,7 +162,15 @@ setDataType = mkDataType "Data.Set.NonEmpty.Internal.NESet" [fromListConstr] +instance A.ToJSON a => A.ToJSON (NESet a) where+ toJSON = A.toJSON . toSet+ toEncoding = A.toEncoding . toSet +instance (A.FromJSON a, Ord a) => A.FromJSON (NESet a) where+ parseJSON = withNonEmpty (fail err) pure+ <=< A.parseJSON+ where+ err = "NESet: Non-empty set expected, but empty set found" -- | /O(log n)/. Smart constructor for an 'NESet' from a 'Set'. Returns