{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}

module Servant.Elm.Internal.Foreign where

import           Data.Proxy      (Proxy (Proxy))
import           Elm             (ElmDatatype, ElmType, toElmType)
import           Servant.Foreign (Foreign, GenerateList, HasForeign,
                                  HasForeignType, Req, listFromAPI, typeFor)


data LangElm

instance (ElmType a) => HasForeignType LangElm ElmDatatype a where
  typeFor _ _ _ =
    toElmType (Proxy :: Proxy a)

getEndpoints
  :: ( HasForeign LangElm ElmDatatype api
     , GenerateList ElmDatatype (Foreign ElmDatatype api))
  => Proxy api
  -> [Req ElmDatatype]
getEndpoints =
  listFromAPI (Proxy :: Proxy LangElm) (Proxy :: Proxy ElmDatatype)