{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
module Miso.TypeLevel ( ToServerRoutes ) where

import Miso.Html
import Servant.API
import Servant.HTML.Lucid

-- | Convert client route type to a server web handler type
type family ToServerRoutes (layout :: k) (wrapper :: * -> *) (action :: *) :: k where
  ToServerRoutes (a :<|> b) wrapper action =
    ToServerRoutes a wrapper action :<|>
      ToServerRoutes b wrapper action
  ToServerRoutes (a :> b) wrapper action =
    a :> ToServerRoutes b wrapper action
  ToServerRoutes (View a) wrapper action =
    Get '[HTML] (wrapper (View action))