Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. protocol Stream {
  2. associatedtype ErrorType: Error
  3. func read() -> Result<Int, ErrorType>
  4. }
  5.  
  6. class FileStream : Stream {
  7. // 固有のエラー型
  8. enum Error : Swift.Error {
  9. case ioError
  10. case fileNotFound
  11. }
  12. typealias ErrorType = Error
  13. func read() -> Result<Int, Error> { return .success(0) }
  14. }
  15.  
  16. class MemoryStream : Stream {
  17. typealias ErrorType = Never
  18. func read() -> Result<Int, Never> { return .success(0) }
  19. }
  20.  
  21. class Parser<S: Stream> {
  22. init(_ s: S) {
  23. self.s = s
  24. }
  25. let s: S
  26. func parse() throws -> Int {
  27. return try s.read().get()
  28. }
  29. }
  30. extension Parser where S.ErrorType == Never {
  31. func parse() -> Int {
  32. switch s.read() {
  33. case .success(let x): return x
  34. // neverなので↓が不要
  35. //case .failure(let e): throw e
  36. }
  37. }
  38. }
  39.  
  40. func main() throws {
  41. let p1: Parser<FileStream> = Parser(FileStream())
  42. let r1 = try p1.parse()
  43.  
  44. // こっちはtryが外せる
  45. let p2: Parser<MemoryStream> = Parser(MemoryStream())
  46. let r2 = p2.parse()
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement