module Buffet.Assemble.JoinConsecutiveRunInstructions
  ( get
  ) where

import qualified Buffet.Ir.Ir as Ir
import qualified Data.Text as T
import qualified Language.Docker as Docker
import qualified Language.Docker.Syntax as Syntax
import Prelude (($), (==), foldr, mconcat)

get :: Ir.DockerfilePart -> Ir.DockerfilePart
get :: DockerfilePart -> DockerfilePart
get = (Instruction Text -> DockerfilePart -> DockerfilePart)
-> DockerfilePart -> DockerfilePart -> DockerfilePart
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Instruction Text -> DockerfilePart -> DockerfilePart
process []
  where
    process :: Instruction Text -> DockerfilePart -> DockerfilePart
process (Docker.Run (Syntax.RunArgs Arguments Text
first RunFlags
flags)) (Docker.Run (Syntax.RunArgs Arguments Text
second RunFlags
flags'):DockerfilePart
rest)
      | RunFlags
flags RunFlags -> RunFlags -> Bool
forall a. Eq a => a -> a -> Bool
== RunFlags
flags' =
        RunArgs Text -> Instruction Text
forall args. RunArgs args -> Instruction args
Docker.Run (Arguments Text -> RunFlags -> RunArgs Text
forall args. Arguments args -> RunFlags -> RunArgs args
Syntax.RunArgs (Arguments Text -> Arguments Text -> Arguments Text
joinRuns Arguments Text
first Arguments Text
second) RunFlags
flags) Instruction Text -> DockerfilePart -> DockerfilePart
forall a. a -> [a] -> [a]
: DockerfilePart
rest
    process Instruction Text
first DockerfilePart
rest = Instruction Text
first Instruction Text -> DockerfilePart -> DockerfilePart
forall a. a -> [a] -> [a]
: DockerfilePart
rest

joinRuns ::
     Docker.Arguments T.Text
  -> Docker.Arguments T.Text
  -> Docker.Arguments T.Text
joinRuns :: Arguments Text -> Arguments Text -> Arguments Text
joinRuns Arguments Text
first Arguments Text
second =
  Text -> Arguments Text
forall args. args -> Arguments args
Syntax.ArgumentsText (Text -> Arguments Text) -> Text -> Arguments Text
forall a b. (a -> b) -> a -> b
$ [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat [Arguments Text -> Text
forall p. Arguments p -> p
command Arguments Text
first, String -> Text
T.pack String
" && ", Arguments Text -> Text
forall p. Arguments p -> p
command Arguments Text
second]
  where
    command :: Arguments p -> p
command (Syntax.ArgumentsText p
shell) = p
shell
    command (Syntax.ArgumentsList p
exec) = p
exec