31 lines
873 B
Haskell
31 lines
873 B
Haskell
module Lib (readFile', tRead, buildGrid, split, count) where
|
|
|
|
import Data.ByteString qualified as B (readFile)
|
|
import Data.Map qualified as M
|
|
import Data.Text (Text)
|
|
import Data.Text.Encoding qualified as T (decodeUtf8)
|
|
import Data.Text.Read qualified as TR
|
|
|
|
-- IO --
|
|
readFile' :: FilePath -> IO Text
|
|
readFile' f = T.decodeUtf8 <$> B.readFile f
|
|
|
|
-- Data.Text --
|
|
tRead :: Text -> Int
|
|
tRead = (\(Right (n, _)) -> n) . TR.signed TR.decimal
|
|
|
|
-- Data.Map --
|
|
buildGrid :: [[a]] -> M.Map (Int, Int) a
|
|
buildGrid xs = M.fromList [((x, y), a) | (row, x) <- zip xs [0 ..], (a, y) <- zip row [0 ..]]
|
|
|
|
-- Utility --
|
|
split :: (Eq a) => a -> [a] -> [[a]]
|
|
split delimiter list =
|
|
let (before, after) = break (== delimiter) list
|
|
in before : case after of
|
|
[] -> []
|
|
(_ : xs) -> split delimiter xs
|
|
|
|
count :: (Eq a) => [a] -> a -> Int
|
|
count xs x = length $ filter (x ==) xs
|