{-# 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