module Drasil.System.DrasilWebsite (
  DrasilWebsite,
  mkDrasilWebsite,
  webRefs,
) where

import Control.Lens (makeLenses, (^.))
import qualified Data.Map.Strict as M

import Drasil.Database (UID, uid)
import Language.Drasil (Reference)

import Drasil.System.Core (HasSystemMeta(..), SystemMeta)

data DrasilWebsite = DW {
  DrasilWebsite -> SystemMeta
_sm :: SystemMeta,
  DrasilWebsite -> Map UID Reference
_webRefs :: M.Map UID Reference
}

makeLenses ''DrasilWebsite

instance HasSystemMeta DrasilWebsite where
  systemMeta :: Lens' DrasilWebsite SystemMeta
systemMeta = (SystemMeta -> f SystemMeta) -> DrasilWebsite -> f DrasilWebsite
Lens' DrasilWebsite SystemMeta
sm

mkDrasilWebsite :: SystemMeta -> [Reference] -> DrasilWebsite
mkDrasilWebsite :: SystemMeta -> [Reference] -> DrasilWebsite
mkDrasilWebsite SystemMeta
m [Reference]
rs = SystemMeta -> Map UID Reference -> DrasilWebsite
DW SystemMeta
m Map UID Reference
refs
  where
    refs :: Map UID Reference
refs = [(UID, Reference)] -> Map UID Reference
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(UID, Reference)] -> Map UID Reference)
-> [(UID, Reference)] -> Map UID Reference
forall a b. (a -> b) -> a -> b
$ (Reference -> (UID, Reference))
-> [Reference] -> [(UID, Reference)]
forall a b. (a -> b) -> [a] -> [b]
map (\Reference
r -> (Reference
r Reference -> Getting UID Reference UID -> UID
forall s a. s -> Getting a s a -> a
^. Getting UID Reference UID
forall c. HasUID c => Getter c UID
Getter Reference UID
uid, Reference
r)) [Reference]
rs