package normalorder import "git.maximhutz.com/max/lambda/pkg/lambda" func ReduceOnce(e lambda.Expression) (lambda.Expression, bool) { switch e := e.(type) { case lambda.Abstraction: body, reduced := ReduceOnce(e.Body()) if reduced { return lambda.NewAbstraction(e.Parameter(), body), true } return e, false case lambda.Application: if fn, fnOk := e.Abstraction().(lambda.Abstraction); fnOk { return fn.Body().Substitute(fn.Parameter(), e.Argument()), true } abs, reduced := ReduceOnce(e.Abstraction()) if reduced { return lambda.NewApplication(abs, e.Argument()), true } arg, reduced := ReduceOnce(e.Argument()) if reduced { return lambda.NewApplication(e.Abstraction(), arg), true } return e, false default: return e, false } }