{-# 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 } )