packages feed

moonlight-pale-0.1.0.0: src-ghc-surface/Moonlight/Pale/Ghc/Expr/Render/Carrier.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}

module Moonlight.Pale.Ghc.Expr.Render.Carrier
  ( LocalBindingRows,
    RenderNodeProjection,
    RenderSource (..),
    projectPatternNode
  )
where

import Data.Kind (Type)
import Data.IntMap.Strict (IntMap)
import GHC.Types.Name.Reader (RdrName)
import Moonlight.Core (Pattern (..))
import Moonlight.Pale.Ghc.Expr.Render.Refusal
import Moonlight.Pale.Ghc.Expr.Syntax

type LocalBindingRows :: Type -> Type
type LocalBindingRows recursive = [(HsPatF, recursive)]

type RenderNodeProjection recursive = recursive -> Either RenderRefusal (HsExprF recursive)

type RenderSource :: Type -> Type
data RenderSource recursive = RenderSource
  { rsProjectNode :: !(RenderNodeProjection recursive),
    rsRenderNames :: !(IntMap RdrName)
  }

projectPatternNode :: RenderNodeProjection (Pattern HsExprF)
projectPatternNode = \case
  PatternVar _ ->
    Left RenderPatternVariable
  PatternNode nodeValue ->
    Right nodeValue