@@ -34,11 +34,10 @@ import Control.Applicative
3434import Control.Lens hiding ((.=))
3535import Data.Aeson hiding (Bool, String)
3636import Data.Aeson.TH
37−import Data.Bifunctor
3837import Data.Char
3938import Data.Function (on)
40−import qualified Data.HashMap.Strict as Map
4139import qualified Data.HashSet as Set
40+import Data.List (groupBy)
4241import Data.List.NonEmpty (NonEmpty (..))
4342import qualified Data.List.NonEmpty as NE
4443import Data.Maybe
@@ -48,10 +47,11 @@ import Data.Text (Text)
4847import qualified Data.Text as Text
4948import qualified Data.Text.Lazy as LText
5049import qualified Data.Text.Lazy.Builder as Build
50+import Data.Text.Manipulate
5151import qualified Data.Text.Read as Read
5252import qualified Filesystem.Path.CurrentOS as Path
5353import Formatting
54−import Gen.Orphans
54+import Gen.Orphans ()
5555import Gen.Text
5656import Gen.Types.Help
5757import Gen.Types.Id
@@ -400,7 +400,9 @@ instance ToJSON (Service Data API) where
400400 ]
401401
402402svcAbbrev :: Service s r -> Text
403−svcAbbrev s = renameAbbrev $ fromMaybe (_svcTitle s) (_svcCanonicalName s)
403+svcAbbrev s = upperHead
404+ . renameAbbrev
405+ $ fromMaybe (_svcTitle s) (_svcCanonicalName s)
404406
405407typeImports, prodImports, sumImports :: Service s r -> [NS]
406408typeImports s = ["Network.Google.Prelude", prodNS s, sumNS s]
@@ -409,7 +411,7 @@ sumImports _ = ["Network.Google.Prelude"]
409411
410412tocNS, typesNS, prodNS, sumNS :: Service s r -> NS
411413tocNS s = NS ["Network", "Google", svcAbbrev s]
412−typesNS = (<> "Types") . tocNS
414+typesNS = (<> "Types") . tocNS
413415prodNS = (<> "Product") . typesNS
414416sumNS = (<> "Sum") . typesNS
415417
@@ -436,3 +438,18 @@ instance ToJSON Library where
436438 , "exposedModules" .= concatMap exposedModules (NE.toList _libServices)
437439 , "otherModules" .= concatMap otherModules (NE.toList _libServices)
438440 ]
441+
442+merge :: Versions -> [Service Data API] -> [Library]
443+merge v = map go . groupBy (on (==) _svcLibrary)
444+ where
445+ go [x] = mk x
446+ go (x:xs) = (mk x) { _libServices = x :| xs }
447+ -- FIXME:
448+ go [] = error "Empty merge set!"
449+
450+ mk x = Library
451+ { _libName = renameLibrary (_svcLibrary x)
452+ , _libTitle = renameTitle (_svcTitle x)
453+ , _libVersions = v
454+ , _libServices = x :| []
455+ }