diff --git a/src/Data/TotalMap.hs b/src/Data/TotalMap.hs
--- a/src/Data/TotalMap.hs
+++ b/src/Data/TotalMap.hs
@@ -3,7 +3,7 @@
 ----------------------------------------------------------------------
 -- |
 -- Module      :  Data.TotalMap
--- Copyright   :  (c) Conal Elliott 2012
+-- Copyright   :  (c) Conal Elliott 2012--2019
 -- License     :  BSD3
 -- 
 -- Maintainer  :  conal@conal.net
@@ -14,8 +14,11 @@
 ----------------------------------------------------------------------
 
 module Data.TotalMap
-  ( TMap,fromPartial,(!),tabulate,trim
-  , intersectionPartialWith,codomain
+  ( TMap,fromPartial
+  , empty, insert, singleton
+  , (!),tabulate,trim
+  , intersectionPartialWith,range
+  , mapKeysWith
   -- , tmapRepr
   ) where
 
@@ -40,9 +43,21 @@
 -- The representation is a default value and a finite map for the rest.
 
 -- | Create a total map from a default value and a partial map.
-fromPartial :: a -> Map k a -> TMap k a
+fromPartial :: v -> Map k v -> TMap k v
 fromPartial = TMap
 
+-- | A total map only default
+empty :: v -> TMap k v
+empty v = TMap v M.empty
+
+-- | Insert a key\/value pair
+insert :: Ord k => k -> v -> TMap k v -> TMap k v
+insert k v (TMap d m) = TMap d (M.insert k v m)
+
+-- | Singleton plus default
+singleton :: Ord k => k -> v -> v -> TMap k v
+singleton k v d = insert k v (empty d)
+
 infixl 9 !
 -- | Sample a total map. Semantic function.
 (!) :: Ord k => TMap k v -> k -> v
@@ -73,9 +88,10 @@
    `M.union`
    fmap (f ad) bm
 
+{-# DEPRECATED range "Non-denotative" #-}
 -- | Witness the finiteness of the support concretely by giving its image.
-codomain :: Ord v => TMap k v -> Set v
-codomain (TMap dflt m) = S.fromList (dflt : M.elems m)
+range :: Ord v => TMap k v -> Set v
+range (TMap dflt m) = S.fromList (dflt : M.elems m)
 
 {--------------------------------------------------------------------
     Instances
@@ -180,6 +196,12 @@
 {--------------------------------------------------------------------
     Misc
 --------------------------------------------------------------------}
+
+mapKeysWith :: (Semiring z, Ord b) => (z -> z -> z) -> (a -> b) -> TMap a z -> TMap b z
+mapKeysWith comb f (TMap d m) = TMap d (M.mapKeysWith comb f m)
+
+-- liftA2Keys :: Ord b => (a -> b -> c) -> TMap a z -> TMap b z -> TMap c z
+-- liftA2Keys f (TMap c m) (TMap d n) = ... -- ??
 
 idMap :: Eq k => Set k -> Map k k
 idMap = M.fromAscList . map (\ k -> (k,k)) . S.toAscList
diff --git a/total-map.cabal b/total-map.cabal
--- a/total-map.cabal
+++ b/total-map.cabal
@@ -1,14 +1,14 @@
 Name:                total-map
-Version:             0.1.0
+Version:             0.1.3
 Cabal-Version:       >= 1.10
-Synopsis:            Finitely represented /total/ maps
+Synopsis:            Finitely represented total maps
 Category:            Data
 Description:
   Finitely represented /total/ maps. Represented by as a partial map and
   a default value. Has Applicative and Monad instances (unlike Data.Map).
 Author:              Conal Elliott
 Maintainer:          conal@conal.net
-Copyright:           (c) 2012 by Conal Elliott
+Copyright:           (c) 2012--2019 by Conal Elliott
 License:             BSD3
 License-File:        COPYING
 Stability:           experimental
@@ -24,8 +24,7 @@
 Library
   hs-Source-Dirs:      src
   Extensions:
-  Build-Depends:       base<5, containers, semiring-num
-                       -- , comonad
+  Build-Depends:       base<5, containers, semiring-num>=1.6.0.4
   Exposed-Modules:     
                        Data.TotalMap
   default-language: Haskell2010
