{-# LANGUAGE DeriveGeneric #-}

module Distribution.Types.ExposedModule where

import Distribution.Compat.Prelude
import Prelude ()

import Distribution.Backpack
import Distribution.ModuleName
import Distribution.Parsec
import Distribution.Pretty

import qualified Distribution.Compat.CharParsing as P
import qualified Text.PrettyPrint as Disp

data ExposedModule = ExposedModule
  { exposedName :: ModuleName
  , exposedReexport :: Maybe OpenModule
  }
  deriving (Eq, Generic, Read, Show)

instance Pretty ExposedModule where
  pretty (ExposedModule m reexport) =
    Disp.hsep
      [ pretty m
      , case reexport of
          Just m' -> Disp.hsep [Disp.text "from", pretty m']
          Nothing -> Disp.empty
      ]

instance Parsec ExposedModule where
  parsec = do
    m <- parsecMaybeQuoted parsec
    P.spaces

    reexport <- P.optional $ do
      _ <- P.string "from"
      P.skipSpaces1
      parsec

    return (ExposedModule m reexport)

instance Binary ExposedModule
instance Structured ExposedModule
instance NFData ExposedModule where rnf = genericRnf
