module Buffet.Parse.PartitionByBuildStage
  ( get
  ) where

import qualified Data.List.Split as Split
import qualified Language.Docker as Docker
import Prelude (Bool(False, True), ($), length, mconcat, pred, splitAt)

get ::
     Docker.Dockerfile
  -> (Docker.Dockerfile, [Docker.Dockerfile], Docker.Dockerfile)
get dockerfile = (beforeFirstStage, localStages, globalStage)
  where
    (beforeFirstStage, stages) =
      case parts of
        [] -> ([], [])
        (first:rest) -> (first, rest)
    parts = Split.split splitter dockerfile
    splitter = Split.keepDelimsL $ Split.whenElt isFrom
    (localStages, globalStageInstructions) =
      splitAt (pred $ length stages) stages
    globalStage = mconcat globalStageInstructions

isFrom :: Docker.InstructionPos a -> Bool
isFrom (Docker.InstructionPos (Docker.From _) _ _) = True
isFrom _ = False