module Day5.Part2 ( execute9001Operation, day5_2 ) where import qualified Data.Sequence as S import Data.Foldable (toList) import Day5.Shared execute9001Operation :: Row -> Operation -> Row execute9001Operation row op = updatedRow where originStack = row `S.index` asInt (from op) targetStack = row `S.index` asInt (to op) movedContent = take (count op) $ content originStack updatedOrigin = Stack (drop (count op) $ content originStack) updatedTarget = Stack (movedContent ++ content targetStack) updatedRow = S.update (asInt $ to op) updatedTarget $ S.update (asInt $ from op) updatedOrigin row day5_2 :: String -> String day5_2 input = toList . findTopOfStacks $ foldl execute9001Operation row operations where (row, operations) = parseInput input