content: module Docs.CLI.Types where
  
  import Data.Text (Text)
  
  import qualified Data.Text as Text
  
  type Url = String
  
  -- | Appears at the end of a url after a pound sign, pointing the element to
  -- focus on.
  --    https://hackage.haskell.org/package/hoogle-5.0.18.1/docs/Hoogle.html#t:Target
  --                                                                         ^^^^^^^^
  type Anchor = Text
  
  dropAnchor :: Url -> Url
  dropAnchor = takeWhile (/= '#')
  
  takeAnchor :: MonadFail m => Url -> m Anchor
  takeAnchor url = case drop 1 $ dropWhile (/= '#') url of
    [] -> fail "no anchor"
    xs -> return $ Text.pack xs
  
  data DeclUrl = DeclUrl ModuleUrl Anchor
    deriving (Eq, Show)
  
  -- | Link to an item in a src page
  data SourceLink = SourceLink Url Anchor
    deriving (Eq, Show)
  
  newtype ModuleUrl = ModuleUrl Url
    deriving (Eq, Show)
  
  -- | Url to a Haddock package page
  newtype PackageUrl = PackageUrl Url
    deriving (Eq, Show)
  
  type FileName = String
  
  type FileContent = Text
  
  newtype RelativeUrl = RelativeUrl Text
  
  data FileInfo = FileInfo
    { fName :: FileName
    , fLine :: Maybe Int
    , fContent :: FileContent
    }
  
  class HasUrl a where
    getUrl :: a -> Url
  
  instance HasUrl DeclUrl where
    getUrl (DeclUrl url anchor) = getUrl url ++ "#" ++ Text.unpack anchor
  instance HasUrl ModuleUrl where
    getUrl (ModuleUrl url) = url
  instance HasUrl SourceLink where
    getUrl (SourceLink url _) = url
  instance HasUrl PackageUrl where
    getUrl (PackageUrl url) = url
  instance HasUrl Url where
    getUrl url = url
  
  