Files
SwiftyCharms/Source/Parser.swift
Ruoyu Fu 7bff1a239a init
2016-02-17 11:04:31 +08:00

46 lines
940 B
Swift

//
// Parser.swift
// SwiftCharms
//
// Created by Ruoyu Fu on 15/2/2016.
// Copyright © 2016 Ruoyu Fu. All rights reserved.
//
struct Parser<T> {
let trunk: String throws-> (T, String)
init(trunk: String throws-> (T, String)){
self.trunk = trunk
}
func parse(input:String) -> Result<T> {
do{
return try .Success(trunk(input).0)
}catch let e{
return .Failure(e)
}
}
}
extension Parser {
static func unit(x:T) -> Parser<T> {
return Parser{(x,$0)}
}
func map<U>(f:T throws-> U) -> Parser<U> {
return flatMap{.unit(try f($0))}
}
func flatMap<U>(f:T throws-> Parser<U>) -> Parser<U> {
return Parser<U>{
let result = try self.trunk($0)
return try f(result.0).trunk(result.1)
}
}
func apply<U>(rf:Parser<T throws-> U>) -> Parser<U> {
return rf.flatMap(map)
}
}