module HIndent.Ast.Declaration.Signature.BooleanFormula
  ( BooleanFormula
  , mkBooleanFormula
  ) where

import qualified GHC.Data.BooleanFormula as GHC
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 BooleanFormula
  = Var (WithComments PrefixName)
  | And [WithComments BooleanFormula]
  | Or [WithComments BooleanFormula]
  | Parens (WithComments BooleanFormula)

instance CommentExtraction BooleanFormula where
  nodeComments :: BooleanFormula -> NodeComments
nodeComments Var {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments And {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments Or {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments Parens {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty BooleanFormula where
  pretty' :: BooleanFormula -> Printer ()
pretty' (Var WithComments PrefixName
x) = WithComments PrefixName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments PrefixName
x
  pretty' (And [WithComments BooleanFormula]
xs) = [Printer ()] -> Printer ()
hvCommaSep ([Printer ()] -> Printer ()) -> [Printer ()] -> Printer ()
forall a b. (a -> b) -> a -> b
$ (WithComments BooleanFormula -> Printer ())
-> [WithComments BooleanFormula] -> [Printer ()]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WithComments BooleanFormula -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty [WithComments BooleanFormula]
xs
  pretty' (Or [WithComments BooleanFormula]
xs) = [Printer ()] -> Printer ()
hvBarSep ([Printer ()] -> Printer ()) -> [Printer ()] -> Printer ()
forall a b. (a -> b) -> a -> b
$ (WithComments BooleanFormula -> Printer ())
-> [WithComments BooleanFormula] -> [Printer ()]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WithComments BooleanFormula -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty [WithComments BooleanFormula]
xs
  pretty' (Parens WithComments BooleanFormula
x) = Printer () -> Printer ()
forall a. Printer a -> Printer a
parens (Printer () -> Printer ()) -> Printer () -> Printer ()
forall a b. (a -> b) -> a -> b
$ WithComments BooleanFormula -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments BooleanFormula
x

mkBooleanFormula :: GHC.BooleanFormula (GHC.LIdP GHC.GhcPs) -> BooleanFormula
mkBooleanFormula :: BooleanFormula (LIdP GhcPs) -> BooleanFormula
mkBooleanFormula (GHC.Var LIdP GhcPs
x) = WithComments PrefixName -> BooleanFormula
Var (WithComments PrefixName -> BooleanFormula)
-> WithComments PrefixName -> BooleanFormula
forall a b. (a -> b) -> a -> b
$ 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
x
mkBooleanFormula (GHC.And [LBooleanFormula (LIdP GhcPs)]
xs) =
  [WithComments BooleanFormula] -> BooleanFormula
And ([WithComments BooleanFormula] -> BooleanFormula)
-> [WithComments BooleanFormula] -> BooleanFormula
forall a b. (a -> b) -> a -> b
$ (GenLocated
   SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
 -> WithComments BooleanFormula)
-> [GenLocated
      SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))]
-> [WithComments BooleanFormula]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula)
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments BooleanFormula
forall a b. (a -> b) -> WithComments a -> WithComments b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BooleanFormula (LIdP GhcPs) -> BooleanFormula
BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula
mkBooleanFormula (WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
 -> WithComments BooleanFormula)
-> (GenLocated
      SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
    -> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName)))
-> GenLocated
     SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments BooleanFormula
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated
  SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated) [LBooleanFormula (LIdP GhcPs)]
[GenLocated
   SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))]
xs
mkBooleanFormula (GHC.Or [LBooleanFormula (LIdP GhcPs)]
xs) =
  [WithComments BooleanFormula] -> BooleanFormula
Or ([WithComments BooleanFormula] -> BooleanFormula)
-> [WithComments BooleanFormula] -> BooleanFormula
forall a b. (a -> b) -> a -> b
$ (GenLocated
   SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
 -> WithComments BooleanFormula)
-> [GenLocated
      SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))]
-> [WithComments BooleanFormula]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula)
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments BooleanFormula
forall a b. (a -> b) -> WithComments a -> WithComments b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BooleanFormula (LIdP GhcPs) -> BooleanFormula
BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula
mkBooleanFormula (WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
 -> WithComments BooleanFormula)
-> (GenLocated
      SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
    -> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName)))
-> GenLocated
     SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments BooleanFormula
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated
  SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated) [LBooleanFormula (LIdP GhcPs)]
[GenLocated
   SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))]
xs
mkBooleanFormula (GHC.Parens LBooleanFormula (LIdP GhcPs)
x) = WithComments BooleanFormula -> BooleanFormula
Parens (WithComments BooleanFormula -> BooleanFormula)
-> WithComments BooleanFormula -> BooleanFormula
forall a b. (a -> b) -> a -> b
$ BooleanFormula (LIdP GhcPs) -> BooleanFormula
BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula
mkBooleanFormula (BooleanFormula (GenLocated SrcSpanAnnN RdrName) -> BooleanFormula)
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments BooleanFormula
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenLocated
  SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
-> WithComments (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated LBooleanFormula (LIdP GhcPs)
GenLocated
  SrcSpanAnnL (BooleanFormula (GenLocated SrcSpanAnnN RdrName))
x