non-empty-containers 0.1.2.0 → 0.1.4.0
raw patch · 4 files changed
+47/−30 lines, 4 filesnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Map.NonEmpty: mapWithKey :: (k -> v -> w) -> NonEmptyMap k v -> NonEmptyMap k w
+ Data.Map.NonEmpty: toMap :: Ord k => NonEmptyMap k v -> Map k v
+ Data.Map.NonEmpty: toNonEmpty :: NonEmptyMap k v -> NonEmpty (k, v)
- Data.Set.NonEmpty: fromSet :: Ord a => Set a -> Maybe (NonEmptySet a)
+ Data.Set.NonEmpty: fromSet :: Set a -> Maybe (NonEmptySet a)
Files
- README.md +5/−0
- non-empty-containers.cabal +7/−3
- src/Data/Map/NonEmpty.hs +24/−13
- src/Data/Set/NonEmpty.hs +11/−14
README.md view
@@ -1,1 +1,6 @@ # non-empty-containers++`non-empty-containers` provides two new data structures, `NonEmptyMap` and+`NonEmptySet`, by extending Haskell's built-in `Map` and `Set` data structures.++Both structures are guaranteed to contain at least one element.
non-empty-containers.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: non-empty-containers-version: 0.1.2.0+version: 0.1.4.0 description: Please see the README on GitHub at <https://github.com/andrewthad/non-empty-containers#readme> homepage: https://github.com/andrewthad/non-empty-containers#readme bug-reports: https://github.com/andrewthad/non-empty-containers/issues@@ -25,6 +25,10 @@ base >=4.11 && <5 , containers >= 0.5.10 && < 0.7 , semigroupoids >= 5.2.0 && < 6.0- ghc-options: -O2 -Wall+ ghc-options:+ -O2+ -Wall+ -Wincomplete-record-updates+ -Wincomplete-uni-patterns+ -Wredundant-constraints default-language: Haskell2010-
src/Data/Map/NonEmpty.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE BangPatterns #-} {-# LANGUAGE DeriveFunctor #-} module Data.Map.NonEmpty@@ -6,18 +7,19 @@ , lookup , foldl1' , foldr1'- , + , mapWithKey+ , toNonEmpty+ , toMap ) where -import Prelude hiding (lookup,foldr1,foldr)-import Data.Bool (bool)-import Data.Semigroup.Foldable (Foldable1)-import Data.List.NonEmpty (NonEmpty((:|)))--import qualified Data.Foldable as F-import qualified Data.Map as M-import qualified Data.Map.Strict as MS+import Data.Bool (bool)+import qualified Data.Foldable as F+import Data.List.NonEmpty (NonEmpty((:|)))+import qualified Data.Map as M+import qualified Data.Map.Strict as MS+import Data.Semigroup.Foldable (Foldable1) import qualified Data.Semigroup.Foldable+import Prelude hiding (foldr, foldr1, lookup) -- | A non-empty map. data NonEmptyMap k v = NonEmptyMap !k v !(M.Map k v)@@ -43,12 +45,12 @@ foldr1 :: (v -> v -> v) -> NonEmptyMap k v -> v foldr1 f (NonEmptyMap _ v m) = case M.maxView m of- Nothing -> v+ Nothing -> v Just (y,m') -> f v (M.foldr f y m') foldMap1 :: Semigroup m => (v -> m) -> NonEmptyMap k v -> m foldMap1 f (NonEmptyMap _ v m) = case M.maxView m of- Nothing -> f v+ Nothing -> f v Just (x,m') -> f v <> M.foldr (\c d -> f c <> d) (f x) m' instance (Ord k, Semigroup v) => Semigroup (NonEmptyMap k v) where@@ -59,7 +61,7 @@ foldMap f (NonEmptyMap _ v m) = f v <> foldMap f m foldl f a (NonEmptyMap _ v m) = M.foldl f (f a v) m foldr f a (NonEmptyMap _ v m) = case M.maxView m of- Nothing -> f v a+ Nothing -> f v a Just (y,m') -> f v (M.foldr f (f y a) m') foldl1 f (NonEmptyMap _ v m) = M.foldl f v m foldr1 = foldr1@@ -81,5 +83,14 @@ foldr1' :: (v -> v -> v) -> NonEmptyMap k v -> v foldr1' f (NonEmptyMap _ v m) = case M.maxView m of- Nothing -> v+ Nothing -> v Just (y,m') -> let !k = M.foldr' f y m' in f v k++mapWithKey :: (k -> v -> w) -> NonEmptyMap k v -> NonEmptyMap k w+mapWithKey f (NonEmptyMap k v m) = NonEmptyMap k (f k v) (M.mapWithKey f m)++toNonEmpty :: NonEmptyMap k v -> NonEmpty (k,v)+toNonEmpty (NonEmptyMap k v m) = (k,v) :| M.toList m++toMap :: Ord k => NonEmptyMap k v -> M.Map k v+toMap (NonEmptyMap k v m) = M.insert k v m
src/Data/Set/NonEmpty.hs view
@@ -8,14 +8,12 @@ , fromNonEmpty ) where -import Prelude hiding (foldr1,foldr)--import Data.List.NonEmpty-import Data.Semigroup.Foldable (Foldable1)--import qualified Data.Set as S-import qualified Data.Foldable as F+import qualified Data.Foldable as F+import Data.List.NonEmpty+import Data.Semigroup.Foldable (Foldable1) import qualified Data.Semigroup.Foldable+import qualified Data.Set as S+import Prelude hiding (foldr, foldr1) -- | A non-empty set. data NonEmptySet a = NonEmptySet !a !(S.Set a)@@ -41,11 +39,11 @@ toSet :: Ord a => NonEmptySet a -> S.Set a -- We should be able to write this without an Ord constraint. -- I cannot find anything in Data.Set.Internal that allows--- me to do an unsafe insert on the left-hand side of a set. +-- me to do an unsafe insert on the left-hand side of a set. toSet (NonEmptySet x xs) = S.insert x xs -- | Attempt to create a non-empty set from a set.-fromSet :: Ord a => S.Set a -> Maybe (NonEmptySet a)+fromSet :: S.Set a -> Maybe (NonEmptySet a) fromSet s = fmap (uncurry NonEmptySet) (S.minView s) -- | Create a non-empty set from a non-empty list.@@ -61,17 +59,17 @@ foldr :: (a -> b -> b) -> b -> NonEmptySet a -> b foldr f b (NonEmptySet a m) = case S.maxView m of- Nothing -> f a b+ Nothing -> f a b Just (y,m') -> f a (S.foldr f (f y b) m') foldr1 :: (a -> a -> a) -> NonEmptySet a -> a foldr1 f (NonEmptySet a s) = case S.maxView s of- Nothing -> a+ Nothing -> a Just (m,s') -> f a (S.foldr f m s') foldMap1 :: Semigroup m => (a -> m) -> NonEmptySet a -> m foldMap1 f (NonEmptySet a s) = case S.maxView s of- Nothing -> f a+ Nothing -> f a Just (m,s') -> f a <> S.foldr (\c d -> f c <> d) (f m) s' instance Show a => Show (NonEmptySet a) where@@ -87,7 +85,7 @@ minimum (NonEmptySet a _) = a maximum (NonEmptySet a s) = case S.lookupMax s of Nothing -> a- Just m -> m+ Just m -> m length (NonEmptySet _ s) = 1 + S.size s null _ = False @@ -101,4 +99,3 @@ EQ -> NonEmptySet x (xs <> ys) LT -> NonEmptySet x (xs <> S.insert y ys) GT -> NonEmptySet y (S.insert x xs <> ys)-