{-# LANGUAGE RecordWildCards #-}

module HIndent.Ast.Declaration.Family.Type.Injectivity
  ( Injectivity
  , mkInjectivity
  ) where

import HIndent.Ast.Name.Prefix
import HIndent.Ast.NodeComments
import HIndent.Ast.WithComments
import qualified HIndent.GhcLibParserWrapper.GHC.Hs as GHC
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments

data Injectivity = Injectivity
  { Injectivity -> WithComments PrefixName
from :: WithComments PrefixName
  , Injectivity -> [WithComments PrefixName]
to :: [WithComments PrefixName]
  }

instance CommentExtraction Injectivity where
  nodeComments :: Injectivity -> NodeComments
nodeComments Injectivity {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty Injectivity where
  pretty' :: Injectivity -> Printer ()
pretty' Injectivity {[WithComments PrefixName]
WithComments PrefixName
from :: Injectivity -> WithComments PrefixName
to :: Injectivity -> [WithComments PrefixName]
from :: WithComments PrefixName
to :: [WithComments PrefixName]
..} = [Printer ()] -> Printer ()
spaced ([Printer ()] -> Printer ()) -> [Printer ()] -> Printer ()
forall a b. (a -> b) -> a -> b
$ WithComments PrefixName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments PrefixName
from Printer () -> [Printer ()] -> [Printer ()]
forall a. a -> [a] -> [a]
: HasCallStack => String -> Printer ()
String -> Printer ()
string String
"->" Printer () -> [Printer ()] -> [Printer ()]
forall a. a -> [a] -> [a]
: (WithComments PrefixName -> Printer ())
-> [WithComments PrefixName] -> [Printer ()]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WithComments PrefixName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty [WithComments PrefixName]
to

mkInjectivity :: GHC.InjectivityAnn GHC.GhcPs -> Injectivity
mkInjectivity :: InjectivityAnn GhcPs -> Injectivity
mkInjectivity (GHC.InjectivityAnn XCInjectivityAnn GhcPs
_ LIdP GhcPs
f [LIdP GhcPs]
t) = Injectivity {[WithComments PrefixName]
WithComments PrefixName
from :: WithComments PrefixName
to :: [WithComments PrefixName]
from :: WithComments PrefixName
to :: [WithComments PrefixName]
..}
  where
    from :: WithComments PrefixName
from = GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated (GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName)
-> GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall a b. (a -> b) -> a -> b
$ (RdrName -> PrefixName)
-> GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN PrefixName
forall a b.
(a -> b) -> GenLocated SrcSpanAnnN a -> GenLocated SrcSpanAnnN b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RdrName -> PrefixName
mkPrefixName LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
f
    to :: [WithComments PrefixName]
to = (GenLocated SrcSpanAnnN RdrName -> WithComments PrefixName)
-> [GenLocated SrcSpanAnnN RdrName] -> [WithComments PrefixName]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated (GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName)
-> (GenLocated SrcSpanAnnN RdrName
    -> GenLocated SrcSpanAnnN PrefixName)
-> GenLocated SrcSpanAnnN RdrName
-> WithComments PrefixName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RdrName -> PrefixName)
-> GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN PrefixName
forall a b.
(a -> b) -> GenLocated SrcSpanAnnN a -> GenLocated SrcSpanAnnN b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RdrName -> PrefixName
mkPrefixName) [LIdP GhcPs]
[GenLocated SrcSpanAnnN RdrName]
t