{-# LANGUAGE PatternSynonyms #-}
module Language.Drasil.Code.PackageData (PackageData(packageProg, packageAux),
  pattern PackageData, package
) where

import Utils.Drasil.FileData (FileAndContents(..))
import Text.PrettyPrint.HughesPJ (isEmpty)
import Drasil.GOOL (ProgData, onCodeList)

-- | The underlying data type for packages in all renderers.
data PackageData = PackD {PackageData -> ProgData
packageProg :: ProgData, PackageData -> [FileAndContents]
packageAux :: [FileAndContents]}

pattern PackageData :: ProgData -> [FileAndContents] -> PackageData
pattern $mPackageData :: forall {r}.
PackageData
-> (ProgData -> [FileAndContents] -> r) -> ((# #) -> r) -> r
$bPackageData :: ProgData -> [FileAndContents] -> PackageData
PackageData prog aux <- PackD prog aux
  where
    PackageData ProgData
prog [FileAndContents]
aux = ProgData -> [FileAndContents] -> PackageData
PackD ProgData
prog ((FileAndContents -> Bool) -> [FileAndContents] -> [FileAndContents]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> (FileAndContents -> Bool) -> FileAndContents -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> Bool
isEmpty (Doc -> Bool)
-> (FileAndContents -> Doc) -> FileAndContents -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FileAndContents -> Doc
fileDoc) [FileAndContents]
aux)
{-# COMPLETE PackageData #-}

package :: (Monad r) => ProgData -> [r FileAndContents] -> r PackageData
package :: forall (r :: * -> *).
Monad r =>
ProgData -> [r FileAndContents] -> r PackageData
package ProgData
p = ([FileAndContents] -> PackageData)
-> [r FileAndContents] -> r PackageData
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList (ProgData -> [FileAndContents] -> PackageData
PackageData ProgData
p)