@@ -21,6 +21,7 @@ import Control.Monad.Writer
2121import Data.Aeson
2222import Data.Char
2323import Data.Data (Data)
24+import Data.Foldable (traverse_)
2425import Data.HashMap.Strict (HashMap)
2526import qualified Data.HashMap.Strict as HashMap
2627import "unordered-containers" Data.HashSet (HashSet)
@@ -196,6 +197,27 @@ inlineSchemas names = inlineSchemasWhen (`elem` names)
196197inlineAllSchemas :: Data s => Definitions -> s -> s
197198inlineAllSchemas = inlineSchemasWhen (const True)
198199
200+-- | Inline all /non-recursive/ schemas for which the definition
201+-- can be found in @'Definitions'@.
202+inlineNonRecursiveSchemas :: Data s => Definitions -> s -> s
203+inlineNonRecursiveSchemas defs = inlineSchemasWhen nonRecursive defs
204+ where
205+ nonRecursive name =
206+ case HashMap.lookup name defs of
207+ Just schema -> name `notElem` execDeclare (usedNames schema) mempty
208+ Nothing -> False
209+
210+ usedNames schema = traverse_ schemaRefNames (schema ^.. template)
211+
212+ schemaRefNames :: Referenced Schema -> Declare [T.Text] ()
213+ schemaRefNames ref = case ref of
214+ Ref (Reference name) -> do
215+ seen <- looks (name `elem`)
216+ when (not seen) $ do
217+ declare [name]
218+ traverse_ usedNames (HashMap.lookup name defs)
219+ Inline subschema -> usedNames subschema
220+
199221class GToSchema (f :: * -> *) where
200222 gdeclareNamedSchema :: SchemaOptions -> proxy f -> Schema -> Declare Definitions NamedSchema
201223