aboutsummaryrefslogtreecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/Scaffolder/Messages/Dependencies.hs
blob: fbcc56bf47cd08d9050403a797de668d41224a4c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{-# LANGUAGE OverloadedStrings #-}

module Text.Edifact.Scaffolder.Messages.Dependencies
  ( -- *
    mkDependenciesHaddock
  , mkDependenciesImports
  , mkDependenciesReexports
  ) where

import           Text.Edifact.Scaffolder.Commons
import           Text.Edifact.Scaffolder.Messages.Types

import           Control.Monad                          ((>=>))
import           Data.List                              (isPrefixOf)
import           Data.List.NonEmpty                     as NE (nonEmpty, toList)
import           Data.Maybe                             (mapMaybe)

unlessIsCommon :: SegmentCode -> Maybe SegmentCode
unlessIsCommon sc@(SegmentCode code) | "U" `isPrefixOf` code = Nothing
                                     | otherwise             = Just sc

mkDependenciesReexports :: NonEmpty Element -> Scaffolding [Export]
mkDependenciesReexports = mkSegmentDependencies mkSegmentDependenciesReexports

mkSegmentDependenciesReexports :: NonEmpty SegmentCode -> Scaffolding [Export]
mkSegmentDependenciesReexports = reexportDependencies fSegmentParserFunction

mkDependenciesImports :: NonEmpty Element -> Scaffolding [ImportGroup]
mkDependenciesImports = mkSegmentDependencies mkSegmentDependenciesImports

mkSegmentDependencies :: (NonEmpty SegmentCode -> Scaffolding [output])
                      -> (NonEmpty Element     -> Scaffolding [output])
mkSegmentDependencies mk = maybe (pure []) mk . filterSegmentDependencies

filterSegmentDependencies :: NonEmpty Element -> Maybe (NonEmpty SegmentCode)
filterSegmentDependencies =
  fmap nub . nonEmpty . mapMaybe (getSegment >=> unlessIsCommon) . NE.toList

mkSegmentDependenciesImports :: NonEmpty SegmentCode -> Scaffolding [ImportGroup]
mkSegmentDependenciesImports =
  fmap (pure . singleImport) . importDependencies "Segments" fSegmentParserFunction

mkDependenciesHaddock :: NonEmpty Element -> Scaffolding [Text]
mkDependenciesHaddock = mkSegmentDependencies mkSegmentDependenciesHaddock

mkSegmentDependenciesHaddock :: NonEmpty SegmentCode -> Scaffolding [Text]
mkSegmentDependenciesHaddock = haddockDependencies fSegmentParserFunction