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.