{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-}

module Jikka.Core.Language.LambdaPatterns where

import Jikka.Core.Language.Expr
import Jikka.Core.Language.FreeVars

pattern $bLamId :: Type -> Expr
$mLamId :: forall r. Expr -> (Type -> r) -> (Void# -> r) -> r
LamId t <-
  (\case Lam x t (Var y) | x == y -> Just t; _ -> Nothing -> Just t)
  where
    LamId Type
t = VarName -> Type -> Expr -> Expr
Lam VarName
"x" Type
t (VarName -> Expr
Var VarName
"x")

pattern $bLamConst :: Type -> Expr -> Expr
$mLamConst :: forall r. Expr -> (Type -> Expr -> r) -> (Void# -> r) -> r
LamConst t e <-
  (\case Lam x t e | x `isUnusedVar` e -> Just (t, e); _ -> Nothing -> Just (t, e))
  where
    LamConst Type
t Expr
e = VarName -> Type -> Expr -> Expr
Lam (Expr -> VarName
findUnusedVarName' Expr
e) Type
t Expr
e