packages feed

mdoc-0.1.0.0: src/Mdoc/Gen/CrossRef.hs

-- |
--
-- Module      : Mdoc.Gen.CrossRef
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.Gen.CrossRef
  ( CrossRef (..)
  , renderCrossRefs
  ) where

import Mdoc.Prelude

import Data.List.NonEmpty qualified as NE
import Mdoc.MacroArg
import Mdoc.MacroName
import Mdoc.MdocLine

data CrossRef = CrossRef
  { name :: String
  , section :: Int -- TODO enum
  }
  deriving stock (Eq, Show)

instance Ord CrossRef where
  a `compare` b = a.section `compare` b.section <> a.name `compare` b.name

renderCrossRefs :: NonEmpty CrossRef -> NonEmpty MdocLine
renderCrossRefs = go . NE.sort
 where
  go ne = map xr_ (init ne) |: xr (last ne)

-- | @.Xr@ for a single (or final) cross reference
xr :: CrossRef -> MdocLine
xr CrossRef {name, section} =
  MacroLine Xr [Bare $ esc $ pack name, Bare $ esc $ pack $ show section]

-- | @.Xr@ for leading cross references with trailing comma
xr_ :: CrossRef -> MdocLine
xr_ CrossRef {name, section} =
  MacroLine Xr [Bare $ esc $ pack name, Bare $ esc $ pack $ show section, ","]