Guest User

Untitled

a guest
Jan 17th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.25 KB | None | 0 0
  1. enum Sum<A,B> {
  2. case left(A)
  3. case right(B)
  4. }
  5.  
  6. struct Product<A,B> {
  7. let a: A
  8. let b: B
  9. }
  10.  
  11. struct Iso<A,B> {
  12. let to: (A) -> B
  13. let from: (B) -> A
  14. }
  15.  
  16. struct Unit { }
  17.  
  18. extension Unit: Show {
  19. var text: String {
  20. return ""
  21. }
  22. }
  23.  
  24.  
  25. protocol Show {
  26. var text: String { get }
  27. }
  28.  
  29. extension Sum: Show where A: Show, B: Show {
  30. var text: String {
  31. switch self {
  32. case .left(let a): return ".left(\(a.text)"
  33. case .right(let b): return ".right(\(b.text)"
  34. }
  35. }
  36. }
  37.  
  38. extension Product: Show where A: Show, B: Show {
  39. var text: String {
  40. return "(\(self.a), \(self.b))"
  41. }
  42. }
  43.  
  44. protocol Generic {
  45. associatedtype Rep
  46. var to: Rep { get }
  47. }
  48.  
  49. struct Rec<A> where A: Generic {
  50. let value: A
  51. }
  52.  
  53. extension Rec: Show where A.Rep: Show {
  54. var text: String {
  55. return value.to.text
  56. }
  57. }
  58.  
  59. extension Array: Generic {
  60. typealias Rep = Sum<Unit, Product<Element, Rec<Array<Element>>>>
  61.  
  62. var to: Sum<Unit, Product<Element, Rec<Array<Element>>>> {
  63. if self.isEmpty { return .left(Unit()) }
  64. return .right(Product(a: self[0], b: Rec(value: Array(self.suffix(from: 1)))))
  65. }
  66. }
  67.  
  68. extension Int: Show {
  69. var text: String {
  70. return "\(self)"
  71. }
  72. }
  73.  
  74. let arr = [1,2,3]
  75. arr.to.text
Add Comment
Please, Sign In to add comment