BrainF*** in the Swift type system

Yes, basically:

enum Byte { x00, x01, ... xff }
enum Bit { case o, I }

extension Byte {
    init(bits: (Bit, Bit, Bit, Bit, Bit, Bit, Bit, Bit) { ... a giant switch }
    var bits: (Bit, Bit, Bit, Bit, Bit, Bit, Bit, Bit) { ... a giant switch }
}

func bsl_byte(_ a: Byte, _ b: Byte) -> Byte {
    let v = a.bits
    switch b {
    case .x00: return a
    case .x01: return .init(bits: (.o, v.0, v.1, v.2, v.3, v.4, v.5, v.6))
    case .x02: return .init(bits: (.o,  .o, v.0, v.1, v.2, v.3, v.4, v.5))
    case .x03: return .init(bits: (.o,  .o,  .o, v.0, v.1, v.2, v.3, v.4))
    case .x04: return .init(bits: (.o,  .o,  .o,  .o, v.0, v.1, v.2, v.3))
    case .x05: return .init(bits: (.o,  .o,  .o,  .o,  .o, v.0, v.1, v.2))
    case .x06: return .init(bits: (.o,  .o,  .o,  .o,  .o,  .o, v.0, v.1))
    case .x07: return .init(bits: (.o,  .o,  .o,  .o,  .o,  .o,  .o, v.0))
    case .x08: return .init(bits: (.o,  .o,  .o,  .o,  .o,  .o,  .o,  .o))
    default: return   .init(bits: (.o,  .o,  .o,  .o,  .o,  .o,  .o,  .o))
    }
}

More details on the journey in the mentioned thread.

3 Likes