packages feed

ytl-0.1.0.0: src/Yesod/Site/Util.hs

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RecordWildCards #-}

module Yesod.Site.Util
  ( SiteCompatible

  , getSite
  , getWidgetSite

  , withSite
  , withWidgetSite
  ) where

import Data.Coerce
import Yesod.Core.Types

getSite :: HandlerData child site -> site
getSite = rheSite . handlerEnv

getWidgetSite :: WidgetData site -> site
getWidgetSite = getSite . wdHandler

type SiteCompatible site site' = (Coercible (Route site) (Route site'), Coercible (Route site') (Route site))

withWidgetSite
  :: SiteCompatible site site'
  => (site -> site')
  -> WidgetData site
  -> WidgetData site'
withWidgetSite f WidgetData{..}
  = WidgetData
      { wdRef = coerce wdRef
      , wdHandler = withSite f wdHandler
      }

withSite
  :: SiteCompatible site site'
  => (site -> site')
  -> HandlerData site site
  -> HandlerData site' site'
withSite f = withSubSite f . withSuperSite f

withSubSite
  :: SiteCompatible site site'
  => (site -> site')
  -> HandlerData site parent
  -> HandlerData site' parent
withSubSite f HandlerData{..}
  = let RunHandlerEnv{..} = handlerEnv
    in
      HandlerData
        { handlerEnv = RunHandlerEnv
            { rheChild = f rheChild
            , rheRoute = coerce rheRoute
            , rheRouteToMaster = rheRouteToMaster . coerce
            , ..
            }
        , ..
        }

withSuperSite
  :: SiteCompatible site site'
  => (site -> site')
  -> HandlerData child site
  -> HandlerData child site'
withSuperSite f HandlerData{..}
  = let RunHandlerEnv{..} = handlerEnv
    in
      HandlerData
        { handlerEnv = RunHandlerEnv
            { rheSite = f rheSite
            , rheRender = rheRender . coerce
            , rheRouteToMaster = coerce . rheRouteToMaster
            , ..
            }
        , ..
        }