Scaffolding a Blog Post
It’s been two months since the last post. I had a chance to learn a lot of cool stuff that I cannot wait to share! But let’s start with something eazy.
Today, we are going to take a look at a short script written in Haskell with a simple goal in mind: scaffolding a new file with an empty frontmatter, ready to house a new blog post (including this one!).
Hopefully, this will also show how nice it is to use Haskell even in a simple case. Including how helpful is to have a strong type system holding our hands in the process.
Suffice to say we need to have an executable file (i.e.
chmod +x file.hs) and the following at the top of the file:
With that in place,
./file.hs is enough to execute the script.
But let’s dive right in the scaffolding one:
main :: IO () main = do today <- formatTime defaultTimeLocale "%F" <$> getCurrentTime -- ^ Get the current UTCTime from the system clock. -- ^ Format time to yyyy-mm-dd. let fileName = fold ["posts", "/", today, "-"] -- ^ Fold strings to a single one. `fold` does so by combining the elements of a -- structure using a monoid. String is an alias for [Char], the Monoid instance -- for [a] uses `<>` to combine `a`s together. In turn `<>` comes from Semigroup. -- The Semigroup instance for [a] defines `<>` as `++`. -- Therefore, `fileName` is the concatenation of the strings in the list. fileExist <- doesFileExist fileName when fileExist $ error "file already exists" -- ^ If it already exists.. -- ^ ..stop execution and display an error message.. writeFile fileName frontmatter -- ..otherwise write `frontmatter` to a file at path `fileName`.
frontmatter is an empty frontmatter ready to be filled:
The whole script can be found on Github.