neuron-0.2.0.0: src/Neuron/Zettelkasten/Store.hs
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE NoImplicitPrelude #-}
-- | Zettel store datastructure
module Neuron.Zettelkasten.Store where
import qualified Data.Map.Strict as Map
import Development.Shake (Action)
import Neuron.Zettelkasten.ID
import qualified Neuron.Zettelkasten.Meta as Meta
import Neuron.Zettelkasten.Type
import Path
import Relude
import qualified Rib.Parser.MMark as RibMMark
type ZettelStore = Map ZettelID Zettel
-- | Load all zettel files
mkZettelStore :: [Path Rel File] -> Action ZettelStore
mkZettelStore files = do
zettels <- forM files $ \file -> do
-- Extensions are computed and applied during rendering, not here.
let mmarkExts = []
doc <- RibMMark.parseWith mmarkExts file
let zid = mkZettelID file
meta = Meta.getMeta doc
title = maybe ("No title for " <> show file) Meta.title meta
zettel = Zettel zid title doc
pure zettel
pure $ Map.fromList $ zettels <&> zettelID &&& id
lookupStore :: ZettelID -> ZettelStore -> Zettel
lookupStore zid = fromMaybe (error $ "No such zettel: " <> unZettelID zid) . Map.lookup zid