{-# Language ImportQualifiedPost, OverloadedStrings #-}
module Advent.Input where
import Advent.Coord (Coord(..), coordLines)
import Data.Array.Unboxed qualified as A
import Data.Map (Map)
import Data.Map.Strict qualified as SMap
import System.Environment (getArgs)
import System.IO (hPutStrLn, stderr)
import Text.Printf (printf)
getRawInput :: Int -> Int -> IO String
getRawInput :: Int -> Int -> IO FilePath
getRawInput Int
y Int
d =
do args <- IO [FilePath]
getArgs
case args of
[] -> FilePath -> IO FilePath
readFile (FilePath -> Int -> Int -> FilePath
forall r. PrintfType r => FilePath -> r
printf FilePath
"inputs/%d/%02d.txt" Int
y Int
d)
FilePath
"-":[FilePath]
_ -> Handle -> FilePath -> IO ()
hPutStrLn Handle
stderr FilePath
"Ready!" IO () -> IO FilePath -> IO FilePath
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO FilePath
getContents
FilePath
"+":FilePath
input:[FilePath]
_ -> FilePath -> IO FilePath
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FilePath
input
FilePath
fn:[FilePath]
_ -> FilePath -> IO FilePath
readFile FilePath
fn
inputFileName :: Int -> FilePath
inputFileName :: Int -> FilePath
inputFileName = FilePath -> Int -> FilePath
forall r. PrintfType r => FilePath -> r
printf FilePath
"inputs/%02d.txt"
getInputLines :: Int -> Int -> IO [String]
getInputLines :: Int -> Int -> IO [FilePath]
getInputLines Int
y Int
d = FilePath -> [FilePath]
lines (FilePath -> [FilePath]) -> IO FilePath -> IO [FilePath]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Int -> IO FilePath
getRawInput Int
y Int
d
getInputArray :: Int -> Int -> IO (A.UArray Coord Char)
getInputArray :: Int -> Int -> IO (UArray Coord Char)
getInputArray Int
y Int
d =
do xs <- Int -> Int -> IO [FilePath]
getInputLines Int
y Int
d
pure $! A.listArray (C 0 0, C (length xs - 1) (length (head xs) - 1)) (concat xs)
getInputMap :: Int -> Int -> IO (Map Coord Char)
getInputMap :: Int -> Int -> IO (Map Coord Char)
getInputMap Int
y Int
d =
do xs <- Int -> Int -> IO [FilePath]
getInputLines Int
y Int
d
pure $! SMap.fromList (coordLines xs)