{-# LANGUAGE TemplateHaskell #-}
{- HLINT ignore "Use newtype instead of data" -}
module Drasil.LessonPlan.Core (
  LessonPlan,
  mkLessonPlan
) where

import Control.Lens (makeLenses)

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

-- | An abstract "lesson plan."
--
-- Please refer to [Ting-Yu's thesis](https://github.com/JacquesCarette/Drasil/blob/main/People/Ting-Yu/thesis.pdf)
-- for more information.
data LessonPlan = LP {
  LessonPlan -> SystemMeta
_sm :: SystemMeta
}
makeLenses ''LessonPlan

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

instance HasProjectName LessonPlan where
  projectName :: Lens' LessonPlan ProjectName
projectName = (SystemMeta -> f SystemMeta) -> LessonPlan -> f LessonPlan
forall c. HasSystemMeta c => Lens' c SystemMeta
Lens' LessonPlan SystemMeta
systemMeta ((SystemMeta -> f SystemMeta) -> LessonPlan -> f LessonPlan)
-> ((ProjectName -> f ProjectName) -> SystemMeta -> f SystemMeta)
-> (ProjectName -> f ProjectName)
-> LessonPlan
-> f LessonPlan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProjectName -> f ProjectName) -> SystemMeta -> f SystemMeta
forall c. HasProjectName c => Lens' c ProjectName
Lens' SystemMeta ProjectName
projectName

-- | Build a 'LessonPlan'.
mkLessonPlan :: SystemMeta -> LessonPlan
mkLessonPlan :: SystemMeta -> LessonPlan
mkLessonPlan = SystemMeta -> LessonPlan
LP