| Copyright | (c) Justin Le 2018 |
|---|---|
| License | BSD3 |
| Maintainer | justin@jle.im |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Map.NonEmpty.Internal
Description
Unsafe internal-use functions used in the implementation of
Data.Map.NonEmpty. These functions can potentially be used to break
the abstraction of NEMap and produce unsound maps, so be wary!
Synopsis
- data NEMap k a = NEMap {}
- singleton :: k -> a -> NEMap k a
- nonEmptyMap :: Map k a -> Maybe (NEMap k a)
- withNonEmpty :: r -> (NEMap k a -> r) -> Map k a -> r
- fromList :: Ord k => NonEmpty (k, a) -> NEMap k a
- toList :: NEMap k a -> NonEmpty (k, a)
- map :: (a -> b) -> NEMap k a -> NEMap k b
- insertWith :: Ord k => (a -> a -> a) -> k -> a -> NEMap k a -> NEMap k a
- union :: Ord k => NEMap k a -> NEMap k a -> NEMap k a
- unions :: (Foldable1 f, Ord k) => f (NEMap k a) -> NEMap k a
- elems :: NEMap k a -> NonEmpty a
- size :: NEMap k a -> Int
- toMap :: NEMap k a -> Map k a
- foldr :: (a -> b -> b) -> b -> NEMap k a -> b
- foldr' :: (a -> b -> b) -> b -> NEMap k a -> b
- foldr1 :: (a -> a -> a) -> NEMap k a -> a
- foldl :: (a -> b -> a) -> a -> NEMap k b -> a
- foldl' :: (a -> b -> a) -> a -> NEMap k b -> a
- foldl1 :: (a -> a -> a) -> NEMap k a -> a
- traverseWithKey :: Applicative t => (k -> a -> t b) -> NEMap k a -> t (NEMap k b)
- traverseWithKey1 :: Apply t => (k -> a -> t b) -> NEMap k a -> t (NEMap k b)
- foldMapWithKey :: Semigroup m => (k -> a -> m) -> NEMap k a -> m
- insertMinMap :: k -> a -> Map k a -> Map k a
- insertMaxMap :: k -> a -> Map k a -> Map k a
- valid :: Ord k => NEMap k a -> Bool
Non-Empty Map type
A non-empty (by construction) map from keys k to values a. At
least one key-value pair exists in an at all times.NEMap k v
Functions that take an NEMap can safely operate on it with the
assumption that it has at least one key-value pair.
Functions that return an NEMap provide an assurance that the result
has at least one key-value pair.
Data.Map.NonEmpty re-exports the API of Data.Map, faithfully
reproducing asymptotics, typeclass constraints, and semantics.
Functions that ensure that input and output maps are both non-empty
(like insert) return NEMap, but functions that
might potentially return an empty map (like delete)
return a Map instead.
You can directly construct an NEMap with the API from
Data.Map.NonEmpty; it's more or less the same as constructing a normal
Map, except you don't have access to empty. There are also
a few ways to construct an NEMap from a Map:
- The
nonEmptyMapsmart constructor will convert ainto aMapk a, returningMaybe(NEMapk a)Nothingif the originalMapwas empty. - You can use the
insertMapfamily of functions to insert a value into aMapto create a guaranteedNEMap. - You can use the
IsNonEmptyandIsEmptypatterns to "pattern match" on aMapto reveal it as either containing aNEMapor an empty map. withNonEmptyoffers a continuation-based interface for deconstructing aMapand treating it as if it were anNEMap.
You can convert an NEMap into a Map with toMap or
IsNonEmpty, essentially "obscuring" the non-empty
property from the type.
Constructors
| NEMap | |
Instances
| Eq2 NEMap Source # | |
| Ord2 NEMap Source # | |
Defined in Data.Map.NonEmpty.Internal | |
| Show2 NEMap Source # | |
| Functor (NEMap k) Source # | |
| Foldable (NEMap k) Source # | Traverses elements in order of ascending keys |
Defined in Data.Map.NonEmpty.Internal Methods fold :: Monoid m => NEMap k m -> m # foldMap :: Monoid m => (a -> m) -> NEMap k a -> m # foldMap' :: Monoid m => (a -> m) -> NEMap k a -> m # foldr :: (a -> b -> b) -> b -> NEMap k a -> b # foldr' :: (a -> b -> b) -> b -> NEMap k a -> b # foldl :: (b -> a -> b) -> b -> NEMap k a -> b # foldl' :: (b -> a -> b) -> b -> NEMap k a -> b # foldr1 :: (a -> a -> a) -> NEMap k a -> a # foldl1 :: (a -> a -> a) -> NEMap k a -> a # elem :: Eq a => a -> NEMap k a -> Bool # maximum :: Ord a => NEMap k a -> a # minimum :: Ord a => NEMap k a -> a # | |
| Traversable (NEMap k) Source # | Traverses elements in order of ascending keys |
| Eq k => Eq1 (NEMap k) Source # | |
| Ord k => Ord1 (NEMap k) Source # | |
Defined in Data.Map.NonEmpty.Internal | |
| (Ord k, Read k) => Read1 (NEMap k) Source # | |
Defined in Data.Map.NonEmpty.Internal | |
| Show k => Show1 (NEMap k) Source # | |
| Comonad (NEMap k) Source # |
Since: 0.1.1.0 |
| Traversable1 (NEMap k) Source # | Traverses elements in order of ascending keys |
| Foldable1 (NEMap k) Source # | Traverses elements in order of ascending keys |
| (Eq k, Eq a) => Eq (NEMap k a) Source # | |
| (Data k, Data a, Ord k) => Data (NEMap k a) Source # | |
Defined in Data.Map.NonEmpty.Internal Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> NEMap k a -> c (NEMap k a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (NEMap k a) # toConstr :: NEMap k a -> Constr # dataTypeOf :: NEMap k a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (NEMap k a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (NEMap k a)) # gmapT :: (forall b. Data b => b -> b) -> NEMap k a -> NEMap k a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> NEMap k a -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> NEMap k a -> r # gmapQ :: (forall d. Data d => d -> u) -> NEMap k a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> NEMap k a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> NEMap k a -> m (NEMap k a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> NEMap k a -> m (NEMap k a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> NEMap k a -> m (NEMap k a) # | |
| (Ord k, Ord a) => Ord (NEMap k a) Source # | |
| (Ord k, Read k, Read e) => Read (NEMap k e) Source # | |
| (Show k, Show a) => Show (NEMap k a) Source # | |
| Ord k => Semigroup (NEMap k a) Source # | Left-biased union |
| (ToJSONKey k, ToJSON a) => ToJSON (NEMap k a) Source # | |
Defined in Data.Map.NonEmpty.Internal | |
| (FromJSONKey k, Ord k, FromJSON a) => FromJSON (NEMap k a) Source # | |
| (NFData k, NFData a) => NFData (NEMap k a) Source # | |
Defined in Data.Map.NonEmpty.Internal | |
singleton :: k -> a -> NEMap k a Source #
O(1). A map with a single element.
singleton 1 'a' == fromList ((1, 'a') :| []) size (singleton 1 'a') == 1
nonEmptyMap :: Map k a -> Maybe (NEMap k a) Source #
O(log n). Smart constructor for an NEMap from a Map. Returns
Nothing if the Map was originally actually empty, and
with an Just nNEMap, if the Map was not empty.
nonEmptyMap and form an
isomorphism: they are perfect structure-preserving inverses of
eachother.maybe empty toMap
See IsNonEmpty for a pattern synonym that lets you
"match on" the possiblity of a Map being an NEMap.
nonEmptyMap (Data.Map.fromList [(3,"a"), (5,"b")]) == Just (fromList ((3,"a") :| [(5,"b")]))
Arguments
| :: r | value to return if map is empty |
| -> (NEMap k a -> r) | function to apply if map is not empty |
| -> Map k a | |
| -> r |
O(log n). A general continuation-based way to consume a Map as if
it were an NEMap. will take a withNonEmpty def fMap. If map is
empty, it will evaluate to def. Otherwise, a non-empty map NEMap
will be fed to the function f instead.
nonEmptyMap==withNonEmptyNothingJust
fromList :: Ord k => NonEmpty (k, a) -> NEMap k a Source #
O(n*log n). Build a non-empty map from a non-empty list of
key/value pairs. See also fromAscList. If the list
contains more than one value for the same key, the last value for the
key is retained.
fromList ((5,"a") :| [(3,"b"), (5, "c")]) == fromList ((5,"c") :| [(3,"b")]) fromList ((5,"c") :| [(3,"b"), (5, "a")]) == fromList ((5,"a") :| [(3,"b")])
toList :: NEMap k a -> NonEmpty (k, a) Source #
O(n). Convert the map to a non-empty list of key/value pairs.
toList (fromList ((5,"a") :| [(3,"b")])) == ((3,"b") :| [(5,"a")])
map :: (a -> b) -> NEMap k a -> NEMap k b Source #
O(n). Map a function over all values in the map.
map (++ "x") (fromList ((5,"a") :| [(3,"b")])) == fromList ((3, "bx") :| [(5, "ax")])
insertWith :: Ord k => (a -> a -> a) -> k -> a -> NEMap k a -> NEMap k a Source #
O(log n). Insert with a function, combining new value and old value.
will insert the pair (key, value) into
insertWith f key value mpmp if key does not exist in the map. If the key does exist, the
function will insert the pair (key, f new_value old_value).
See insertMapWith for a version where the first
argument is a Map.
insertWith (++) 5 "xxx" (fromList ((5,"a") :| [(3,"b")])) == fromList ((3, "b") :| [(5, "xxxa")]) insertWith (++) 7 "xxx" (fromList ((5,"a") :| [(3,"b")])) == fromList ((3, "b") :| [(5, "a"), (7, "xxx")])
union :: Ord k => NEMap k a -> NEMap k a -> NEMap k a Source #
O(m*log(n/m + 1)), m <= n.
The expression () takes the left-biased union of union t1 t2t1 and
t2. It prefers t1 when duplicate keys are encountered, i.e.
().union == unionWith const
union (fromList ((5, "a") :| [(3, "b")])) (fromList ((5, "A") :| [(7, "C")])) == fromList ((3, "b") :| [(5, "a"), (7, "C")])
unions :: (Foldable1 f, Ord k) => f (NEMap k a) -> NEMap k a Source #
The left-biased union of a non-empty list of maps.
unions (fromList ((5, "a") :| [(3, "b")]) :| [fromList ((5, "A") :| [(7, "C")]), fromList ((5, "A3") :| [(3, "B3")])])
== fromList [(3, "b"), (5, "a"), (7, "C")]
unions (fromList ((5, "A3") :| [(3, "B3")]) :| [fromList ((5, "A") :| [(7, "C")]), fromList ((5, "a") :| [(3, "b")])])
== fromList ((3, "B3") :| [(5, "A3"), (7, "C")])elems :: NEMap k a -> NonEmpty a Source #
O(n). Return all elements of the map in the ascending order of their keys.
elems (fromList ((5,"a") :| [(3,"b")])) == ("b" :| ["a"])size :: NEMap k a -> Int Source #
O(1). The number of elements in the map. Guaranteed to be greater than zero.
size (singleton 1 'a') == 1 size (fromList ((1,'a') :| [(2,'c'), (3,'b')])) == 3
toMap :: NEMap k a -> Map k a Source #
O(log n).
Convert a non-empty map back into a normal possibly-empty map, for usage
with functions that expect Map.
Can be thought of as "obscuring" the non-emptiness of the map in its
type. See the IsNotEmpty pattern.
nonEmptyMap and form an isomorphism: they
are perfect structure-preserving inverses of eachother.maybe empty toMap
toMap (fromList ((3,"a") :| [(5,"b")])) == Data.Map.fromList [(3,"a"), (5,"b")]
Folds
foldr' :: (a -> b -> b) -> b -> NEMap k a -> b Source #
O(n). A strict version of foldr. Each application of the operator
is evaluated before using the result in the next application. This
function is strict in the starting value.
foldl' :: (a -> b -> a) -> a -> NEMap k b -> a Source #
O(n). A strict version of foldl. Each application of the operator
is evaluated before using the result in the next application. This
function is strict in the starting value.
Traversals
traverseWithKey :: Applicative t => (k -> a -> t b) -> NEMap k a -> t (NEMap k b) Source #
O(n).
That is, behaves exactly like a regular traverseWithKey f m == fromList $ traverse ((k, v) -> (,) k $ f k v) (toList m)traverse except that the traversing
function also has access to the key associated with a value.
Use traverseWithKey1 whenever possible (if your Applicative
also has Apply instance). This version is provided only for types
that do not have Apply instance, since Apply is not at the moment
(and might not ever be) an official superclass of Applicative.
traverseWithKeyf =unwrapApplicative.traverseWithKey1(\k -> WrapApplicative . f k)
traverseWithKey1 :: Apply t => (k -> a -> t b) -> NEMap k a -> t (NEMap k b) Source #
O(n).
traverseWithKey1 f m == fromList $ traverse1 ((k, v) -> (,) k $ f k v) (toList m)
That is, behaves exactly like a regular traverse1 except that the traversing
function also has access to the key associated with a value.
Is more general than traverseWithKey, since works with all Apply,
and not just Applicative.
foldMapWithKey :: Semigroup m => (k -> a -> m) -> NEMap k a -> m Source #
O(n). Fold the keys and values in the map using the given semigroup, such that
foldMapWithKeyf =fold1.mapWithKeyf
This can be an asymptotically faster than
foldrWithKey or foldlWithKey for
some monoids.
Unsafe Map Functions
insertMinMap :: k -> a -> Map k a -> Map k a Source #
O(log n). Insert new key and value into a map where keys are
strictly greater than the new key. That is, the new key must be
strictly less than all keys present in the Map. /The precondition
is not checked./
While this has the same asymptotics as Data.Map.insert, it saves
a constant factor for key comparison (so may be helpful if comparison is
expensive) and also does not require an Ord instance for the key type.
insertMaxMap :: k -> a -> Map k a -> Map k a Source #
O(log n). Insert new key and value into a map where keys are
strictly less than the new key. That is, the new key must be
strictly greater than all keys present in the Map. /The
precondition is not checked./
While this has the same asymptotics as Data.Map.insert, it saves
a constant factor for key comparison (so may be helpful if comparison is
expensive) and also does not require an Ord instance for the key type.