module AOC.Challenge.Day09 (
    day09a
  , day09b
  ) where
import           AOC.Common.Intcode        (Memory, IErr, yieldAndDie, stepForever, parseMem)
import           AOC.Solver                ((:~>)(..))
import           AOC.Util                  (eitherToMaybe)
import           Control.Monad             (join)
import           Data.Conduino             (runPipe, (.|), await)
runProg :: Int -> Memory -> Either IErr (Maybe Int)
runProg i m = runPipe $ yieldAndDie i
                     .| stepForever m
                     .| await
day09a :: Memory :~> Int
day09a = MkSol
    { sParse = parseMem
    , sShow  = show
    , sSolve = join . eitherToMaybe . runProg 1
    }
day09b :: Memory :~> Int
day09b = MkSol
    { sParse = parseMem
    , sShow  = show
    , sSolve = join . eitherToMaybe . runProg 2
    }