专栏首页大话swift撸一个便捷带bug的PromiseKit

撸一个便捷带bug的PromiseKit

今天我们梳理了PromiseKit,于是我们根据原理和流程大体撸一个PromiseKit,大家感受一下其中的思维逻辑

enum Result<T>{

case pending

case resolved(T)

}

class Box<T>{

func inspect(b: (T)->Void){

}

func seal(_ :T)->Void{

}

}

class ABox<T>: Box<T>{

var value:Result<T>

init(value: T ) {

self.value = Result.resolved(value)

}

override func inspect(b: (T) -> Void) {

switch value {

case .pending:

break

case .resolved(let v):

b(v)

break

default:

print("none")

}

}

override func seal(_: T) {

print("seal",self,value)

}

}

protocol Able{

associatedtype T

func pipe(to:(Result<T>)->Void)

}

class A<T>: Able{

var box:ABox<Result<T>>

init(_ v:Result<T>) {

self.box = ABox.init(value: v)

}

func pipe(to:(Result<T>)->Void){

box.inspect { (v:Result<T>) in

to(v)

}

}

}

extension Able{

func then<U:Able>(_ body:(T)->U) -> A<U.T>{

let next = A<U.T>.init(.pending)

pipe { (v:Result<T>) in

print(v)

switch v {

case .pending:

print("then pending")

break

case .resolved(let value):

print(value)

let rv = body(value)

rv.pipe(to: next.box.seal)

break

}

}

return next

}

func map<U>(_ transform:(T)->U) -> A<U>{

let next = A<U>.init(.pending)

pipe { (v:Result<T>) in

switch v {

case .pending:

break

case .resolved(let value):

next.box.seal(Result.resolved(transform(value)))

break

}

}

return next

}

}

var a:A<String> = A.init(.resolved("AAAAAA"))

func firstyl<U>(exec body:()->U) -> A<U.T> where U:Able{

let rp = A<U.T>.init(.pending)

print("firstly")

body().pipe(to: rp.box.seal)

return rp

}

firstyl { () -> A<String> in

return A<String>.init(Result<String>.resolved("A"))

}.then { (msg:String) -> A<Int> in

print("msg", msg)

return A<Int>.init(Result<Int>.resolved(1))

}

func ax<T>(a:T){

print("ax", a)

}

func bx<T>(value:T, _ b:(T)->Void){

b(value)

print("bx")

}

bx(value: "ax",ax)

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:YuLongLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • protocol buffer基本科普

    pb有一套自己的语法定义数据格式,根据特性的语法形式定义数据,个人可以根据需要自定义DSL进行格式转换各个平台的语言代码,当然了这样的工作量是巨大的,G...

    大话swift
  • vapor 切换MySQL作为Cache存储容器

    之前做了将SQLite作为Cache的说明,现在由于把数据全部迁移到MySQL存储因此需要把Cache也转移到MySQL作为存储媒介,由于官方没有很好的实例于仿...

    大话swift
  • 蹭个热门:Flutter Plugin数据传递通信实例梳理

    今天突然翻到放置大概4个月的Flutter笔记--Flutter Plugin数据传递通信实例梳理

    大话swift
  • 最新Shader组件已经上传Github,再盘点一下Creator星球上的几大开源工具包

    晓衡开始写公众号,最早是从上架 Cocos 商店的 pbkiller 插件开始的,到今天有2年了。在这期间,又陆续在公众号上分享了多个实用工具包,在这里统一盘点...

    张晓衡
  • 资源 | 正则表达式的功法大全,做NLP再也不怕搞不定字符串了

    正则表达式(regex 或 regexp)对于从文本中抽取信息极其有用,它一般会搜索匹配特定模式的语句,而这种模式及具体的 ASCII 序列或 Unicode ...

    机器之心
  • 资源 | 正则表达式的功法大全

    正则表达式(regex 或 regexp)对于从文本中抽取信息极其有用,它一般会搜索匹配特定模式的语句,而这种模式及具体的 ASCII 序列或 Unicode ...

    昱良
  • Wordpress <= 4.6.1 使用主题文件触发存储型XSS 漏洞分析

    Author: p0wd3r (知道创宇404安全实验室) 0x00 漏洞概述 1.漏洞简介 WordPress是一个以PHP和MySQL为平台的自由开源的博客...

    Seebug漏洞平台
  • 物联网产业进展

          2009年温家宝总理在江苏无锡调研时,强调了发展“物联网”的重要意义,并提出了要把无锡建设称为“感知中国”的中心。2010年1月14日,接到消息,有...

    ShiJiong
  • 一个可以查看其他人的实时位置的行车记录仪程序

    BlackVue是一家拥有自己的社交网络的行车记录仪公司。通过在车内安装一个小型的互联网行车记录仪,BlackVue用户可以在行车记录仪的摄像机检测到异常事件(...

    用户1631416
  • 聊聊flink的slot.request.timeout配置

    flink-release-1.7.2/flink-core/src/main/java/org/apache/flink/configuration/JobM...

    codecraft

扫码关注云+社区

领取腾讯云代金券