{-# LANGUAGE RecordWildCards #-}

module HIndent.Ast.Declaration.Class.FunctionalDependency
  ( FunctionalDependency
  , mkFunctionalDependency
  ) 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 FunctionalDependency = FunctionalDependency
  { FunctionalDependency -> [WithComments PrefixName]
from :: [WithComments PrefixName]
  , FunctionalDependency -> [WithComments PrefixName]
to :: [WithComments PrefixName]
  }

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

instance Pretty FunctionalDependency where
  pretty' :: FunctionalDependency -> Printer ()
pretty' (FunctionalDependency {[WithComments PrefixName]
from :: FunctionalDependency -> [WithComments PrefixName]
to :: FunctionalDependency -> [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 ())
-> [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]
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

mkFunctionalDependency :: GHC.FunDep GHC.GhcPs -> FunctionalDependency
mkFunctionalDependency :: FunDep GhcPs -> FunctionalDependency
mkFunctionalDependency (GHC.FunDep XCFunDep GhcPs
_ [LIdP GhcPs]
f [LIdP GhcPs]
t) = FunctionalDependency {[WithComments PrefixName]
from :: [WithComments PrefixName]
to :: [WithComments PrefixName]
from :: [WithComments PrefixName]
to :: [WithComments PrefixName]
..}
  where
    from :: [WithComments PrefixName]
from = (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]
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