packages feed

non-empty-containers 0.1.0.0 → 0.1.1.0

raw patch · 3 files changed

+53/−1 lines, 3 files

Files

non-empty-containers.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: non-empty-containers-version: 0.1.0.0+version: 0.1.1.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@@ -19,6 +19,7 @@ library   exposed-modules:     Data.Set.NonEmpty+    Data.Map.NonEmpty   hs-source-dirs: src   build-depends:       base >=4.11 && <5
+ src/Data/Map/NonEmpty.hs view
@@ -0,0 +1,38 @@+module Data.Map.NonEmpty+  ( NonEmptyMap+  , singleton+  , lookup+  ) where++import Prelude hiding (lookup)+import Data.Bool (bool)++import qualified Data.Map as M+import qualified Data.Map.Strict as MS++-- | A non-empty map.+data NonEmptyMap k v = NonEmptyMap !k v !(M.Map k v)+  deriving (Eq,Ord)++-- | A map with a single element.+singleton :: k -> v -> NonEmptyMap k v+singleton k v = NonEmptyMap k v M.empty++-- | Lookup the value at a key in the map.+lookup :: Ord k => k -> NonEmptyMap k a -> Maybe a+lookup a (NonEmptyMap k v xs) = maybe+  (bool Nothing (Just v) (a == k))+  Just+  (M.lookup a xs)++unionAppend :: (Ord k, Semigroup v)+  => NonEmptyMap k v -> NonEmptyMap k v -> NonEmptyMap k v+unionAppend (NonEmptyMap xk xv xs) (NonEmptyMap yk yv ys) = case compare xk yk of+  EQ -> NonEmptyMap xk (xv <> yv) (MS.unionWith (<>) xs ys)+  LT -> NonEmptyMap xk xv (MS.unionWith (<>) xs (M.insertWith (<>) yk yv ys))+  GT -> NonEmptyMap yk yv (MS.unionWith (<>) (M.insertWith (<>) xk xv xs) ys)++instance (Ord k, Semigroup v) => Semigroup (NonEmptyMap k v) where+  (<>) = unionAppend++
src/Data/Set/NonEmpty.hs view
@@ -1,6 +1,8 @@ module Data.Set.NonEmpty   ( NonEmptySet   , singleton+  , member+  , toSet   , toNonEmpty   , fromNonEmpty   ) where@@ -24,6 +26,17 @@ -- | Convert a non-empty set to a non-empty list. toNonEmpty :: NonEmptySet a -> NonEmpty a toNonEmpty (NonEmptySet x xs) = x :| S.toList xs++-- | Is the element in the set?+member :: Ord a => a -> NonEmptySet a -> Bool+member a (NonEmptySet x xs) = S.member a xs || a == x++-- | Convert a non-empty set to a set.+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. +toSet (NonEmptySet x xs) = S.insert x xs  -- | Create a non-empty set from a non-empty list. fromNonEmpty :: Ord a => NonEmpty a -> NonEmptySet a