1
1
mirror of https://github.com/github/semantic.git synced 2024-11-29 11:02:26 +03:00
semantic/prototype/Doubt/Fix.swift

15 lines
967 B
Swift
Raw Normal View History

2015-10-02 20:54:34 +03:00
/// The fixpoint of `Syntax`.
2015-10-02 20:21:43 +03:00
///
2015-10-02 20:54:34 +03:00
/// `Syntax` is a non-recursive type parameterized by the type of its child nodes. Instantiating it to `Fix` makes it into a recursive tree by tying the knoteach child node of `Syntax<Fix, A>` is represented by a `Fix` which in turn contains a `Syntax<Fix, A>`. So in the same way that the `fix` function allows one to tie a non-recursive function into a recursive one, `Fix` allows one to tie a non-recursive type into a recursive one. Unfortunately, due to Swifts lack of higher-rank types, this cannot currently be abstracted over the type which is made recursive, and thus it is hard-coded to `Syntax<Fix, A>` rather than provided by a type parameter `F` applied to `Fix<F>`.
2015-10-02 20:42:55 +03:00
public enum Fix<A> {
2015-10-02 21:08:03 +03:00
/// A recursive instantiation of `Syntax`, unrolling another iteration of the recursive type.
2015-10-02 20:21:43 +03:00
indirect case In(Syntax<Fix, A>)
2015-10-02 20:42:55 +03:00
public var out: Syntax<Fix, A> {
2015-10-02 20:21:43 +03:00
switch self {
case let .In(s):
return s
}
}
}