42 lines
1.0 KiB
Haskell
42 lines
1.0 KiB
Haskell
|
{-# LANGUAGE NamedFieldPuns #-}
|
||
|
{- LANGUAGE OverloadedStrings #-}
|
||
|
module Article (
|
||
|
Article(..)
|
||
|
, at
|
||
|
) where
|
||
|
|
||
|
import Control.Monad.State (evalState, state)
|
||
|
import Data.Text (Text, pack)
|
||
|
import System.FilePath ((</>))
|
||
|
import System.Posix.Types (FileID)
|
||
|
import System.Posix.Files (FileStatus, getFileStatus, fileID)
|
||
|
|
||
|
data Article = Article {
|
||
|
urlPath :: Text
|
||
|
, fileStatus :: FileStatus
|
||
|
, title :: String
|
||
|
, preview :: String
|
||
|
}
|
||
|
|
||
|
parseBegining :: Int -> String -> (String, String)
|
||
|
parseBegining linesCount = evalState (do
|
||
|
first <- state $ splitAt 1
|
||
|
second <- state $ splitAt linesCount
|
||
|
return (unlines first, unlines second)
|
||
|
) . lines
|
||
|
|
||
|
at :: Int -> FilePath -> IO (FileID, Article)
|
||
|
at linesCount filePath = do
|
||
|
fileStatus <- getFileStatus filePath
|
||
|
(title, preview) <- parseBegining linesCount <$> readFile filePath
|
||
|
return (
|
||
|
fileID fileStatus
|
||
|
, Article {
|
||
|
urlPath = pack $ "/" </> filePath
|
||
|
, fileStatus
|
||
|
, title
|
||
|
, preview
|
||
|
}
|
||
|
)
|
||
|
|