@@ -13,81 +13,72 @@ namespace Lake
13
13
/-! # Active Targets -/
14
14
--------------------------------------------------------------------------------
15
15
16
- structure ActiveTarget. {u,v} (ι : Type u) (k : Type u → Type v) (τ : Type u) where
17
- task : k (ι × τ)
18
-
19
- instance [Inhabited ι] [Inhabited τ] [Pure k] : Inhabited (ActiveTarget ι k τ) :=
20
- ⟨⟨pure default⟩⟩
16
+ def ActiveTarget. {u,v} (ι : Type u) (k : Type u → Type v) (τ : Type u) :=
17
+ k (ι × τ)
21
18
22
19
namespace ActiveTarget
23
20
24
- def withoutInfo [Functor k] (target : ActiveTarget ι k t) : ActiveTarget PUnit k t :=
25
- mk <| ( fun (_,t) => ((),t)) <$> target. task
21
+ @[inline] def mk (task : k (ι × τ)) : ActiveTarget ι k τ :=
22
+ task
26
23
27
- def « opaque » [Functor k] (task : k t ) : ActiveTarget PUnit k t :=
28
- mk <| ((), ·) <$> task
24
+ @[inline] def task (target : ActiveTarget ι k τ ) : k (ι × τ) :=
25
+ target
29
26
30
- protected def pure [Pure k] (info : ι) (trace : τ) : ActiveTarget ι k τ :=
31
- mk <| pure (info, trace)
32
-
33
- def nil [NilTrace τ] [Pure k] : ActiveTarget PUnit k τ :=
34
- mk <| pure ((), nilTrace)
27
+ instance [Inhabited ι] [Inhabited τ] [Pure k] : Inhabited (ActiveTarget ι k τ) :=
28
+ ⟨mk <| pure default⟩
35
29
36
- protected def bindSync [BindSync m n k] (self : ActiveTarget ι k α) (f : ι → α → m β) : n (k β) :=
37
- bindSync self.task fun (i, a) => f i a
30
+ @[inline] def « opaque » [Functor k] (task : k t) : ActiveTarget PUnit k t :=
31
+ mk <| ((), ·) <$> task
38
32
39
- protected def bindOpaqueSync [BindSync m n k] (self : ActiveTarget ι k α) (f : α → m β) : n (k β) :=
40
- bindSync self.task fun (_, a) => f a
33
+ @[inline] def nil [NilTrace τ] [Pure k] : ActiveTarget PUnit k τ :=
34
+ mk <| pure ((), nilTrace)
41
35
42
- protected def bindAsync [BindAsync n k] (self : ActiveTarget ι k α) (f : ι → α → n (k β)) : n (k β) :=
43
- bindAsync self.task fun (i, a) => f i a
36
+ @[inline] protected def bindSync [BindSync m n k]
37
+ (self : ActiveTarget ι k α) (f : ι → α → m β) : n (k β) :=
38
+ bindSync self fun (i, a) => f i a
44
39
45
- protected def bindOpaqueAsync [BindAsync n k] (self : ActiveTarget ι k α) (f : α → n (k β)) : n (k β) :=
46
- bindAsync self.task fun (_, a) => f a
40
+ @[inline] protected def bindOpaqueSync [BindSync m n k]
41
+ (self : ActiveTarget ι k α) (f : α → m β) : n (k β) :=
42
+ bindSync self fun (_, a) => f a
47
43
48
- def materialize [Await k n] [MonadLiftT n m] [Functor m] (self : ActiveTarget ι k τ) : m τ :=
49
- (·.2 ) <$> liftM (await self.task)
44
+ @[inline] protected def bindAsync [BindAsync n k]
45
+ (self : ActiveTarget ι k α) (f : ι → α → n (k β)) : n (k β) :=
46
+ bindAsync self fun (i, a) => f i a
50
47
51
- def materializeAsync [Functor k] (self : ActiveTarget ι k τ) : k τ :=
52
- (·.2 ) <$> self.task
48
+ @[inline] protected def bindOpaqueAsync [BindAsync n k]
49
+ (self : ActiveTarget ι k α) (f : α → n (k β)) : n (k β) :=
50
+ bindAsync self fun (_, a) => f a
53
51
54
- def build [Await k n] [MonadLiftT n m] [Functor m] (self : ActiveTarget ι k τ) : m ι :=
52
+ @[inline] def build
53
+ [Await k n] [MonadLiftT n m] [Functor m] (self : ActiveTarget ι k τ) : m ι :=
55
54
(·.1 ) <$> liftM (await self.task)
56
55
57
- def buildOpaque [Await k n] [MonadLiftT n m] [Functor m] (self : ActiveTarget ι k τ) : m PUnit :=
58
- discard <| self.materialize
56
+ @[inline] def buildOpaque
57
+ [Await k n] [MonadLiftT n m] [Functor m] (self : ActiveTarget ι k τ) : m PUnit :=
58
+ discard <| liftM (await self.task)
59
59
60
- def mixOpaqueAsync
61
- [MixTrace τ] [SeqWithAsync n k] [MonadLiftT n m] [Monad m]
62
- (t1 : ActiveTarget α k τ) (t2 : ActiveTarget β k τ) : m (ActiveTarget PUnit k τ) := do
63
- pure <| mk <| ← liftM <| seqWithAsync (fun (_,t) (_,t') => ((), mixTrace t t')) t1.task t2.task
60
+ variable [MixTrace τ] [SeqWithAsync n k] [MonadLiftT n m] [Monad m]
64
61
65
- section
66
- variable [NilTrace τ] [MixTrace τ]
67
-
68
- def materializeList [Await k n] [MonadLiftT n m] [Monad m] (targets : List (ActiveTarget ι k τ)) : m τ := do
69
- targets.foldlM (fun tr t => return mixTrace tr <| ← t.materialize) nilTrace
70
-
71
- def materializeArray [Await k n] [MonadLiftT n m] [Monad m] (targets : Array (ActiveTarget ι k τ)) : m τ := do
72
- targets.foldlM (fun tr t => return mixTrace tr <| ← t.materialize) nilTrace
62
+ def mixOpaqueAsync
63
+ (t1 : ActiveTarget α k τ) (t2 : ActiveTarget β k τ) : m (ActiveTarget PUnit k τ) :=
64
+ mk <$> liftM (seqWithAsync (fun (_,t) (_,t') => ((), mixTrace t t')) t1 t2)
73
65
74
- variable [SeqWithAsync n k ] [Monad n] [MonadLiftT n m] [Monad m ] [Pure k]
66
+ variable [NilTrace τ ] [Monad n] [Pure k]
75
67
76
68
def collectList (targets : List (ActiveTarget ι k τ)) : m (ActiveTarget (List ι) k τ) := mk <$> do
77
- liftM <| foldLeftListAsync (fun (i,t') (a,t) => (i :: a, mixTrace t t')) ([], nilTrace) <| targets.map (·.task)
69
+ liftM <| foldLeftListAsync (fun (i,t') (a,t) => (i :: a, mixTrace t t')) ([], nilTrace) targets
78
70
79
71
def collectArray (targets : Array (ActiveTarget ι k τ)) : m (ActiveTarget (Array ι) k τ) := mk <$> do
80
- liftM <| foldRightArrayAsync (fun (a,t) (i,t') => (a.push i, mixTrace t t')) (#[], nilTrace) <| targets.map (·.task)
72
+ liftM <| foldRightArrayAsync (fun (a,t) (i,t') => (a.push i, mixTrace t t')) (#[], nilTrace) targets
81
73
82
74
variable [Functor k]
83
75
84
76
def collectOpaqueList (targets : List (ActiveTarget ι k τ)) : m (ActiveTarget PUnit k τ) := «opaque » <$> do
85
- liftM <| foldLeftListAsync (fun (_,t') t => mixTrace t t') nilTrace <| targets.map (·.task)
77
+ liftM <| foldLeftListAsync (fun (_,t') t => mixTrace t t') nilTrace targets
86
78
87
79
def collectOpaqueArray (targets : Array (ActiveTarget ι k τ)) : m (ActiveTarget PUnit k τ) := «opaque » <$> do
88
- liftM <| foldRightArrayAsync (fun t (_,t') => mixTrace t t') nilTrace <| targets.map (·.task)
80
+ liftM <| foldRightArrayAsync (fun t (_,t') => mixTrace t t') nilTrace targets
89
81
90
- end
91
82
end ActiveTarget
92
83
93
84
--------------------------------------------------------------------------------
@@ -102,88 +93,46 @@ instance [Inhabited ι] [Inhabited τ] [Pure n] [Pure k] : Inhabited (Target ι
102
93
103
94
namespace Target
104
95
105
- def «opaque » [Functor n] [Functor k] (task : n (k τ)) : Target PUnit n k τ :=
106
- mk <| ((fun t => ((), t)) <$> ·) <$> task
107
-
108
- def opaqueSync [Sync m n k] [Functor m] (act : m τ) : Target PUnit n k τ :=
109
- mk <| sync <| ((), ·) <$> act
110
-
111
- def opaqueAsync [Async m n k] [Functor m] (act : m τ) : Target PUnit n k τ :=
112
- mk <| async <| ((), ·) <$> act
96
+ @[inline] def active [Pure n] (target : ActiveTarget ι k τ) : Target ι n k τ :=
97
+ mk <| pure target
113
98
114
- protected def sync [Sync m n k] [Functor m] (info : ι) (act : m τ) : Target ι n k τ :=
115
- mk <| sync <| (info, ·) <$> act
116
-
117
- protected def async [Async m n k] [Functor m] (info : ι) (act : m τ) : Target ι n k τ :=
118
- mk <| async <| (info, ·) <$> act
119
-
120
- def active [Pure n] (target : ActiveTarget ι k τ) : Target ι n k τ :=
121
- mk <| pure target.task
122
-
123
- protected def pure [Pure n] [Pure k] (info : ι) (trace : τ) : Target ι n k τ :=
124
- mk <| pure <| pure (info, trace)
125
-
126
- def nil [NilTrace τ] [Pure n] [Pure k] : Target PUnit n k τ :=
99
+ @[inline] def nil [NilTrace τ] [Pure n] [Pure k] : Target PUnit n k τ :=
127
100
mk <| pure <| pure <| ((), nilTrace)
128
101
129
- def computeSync [Functor m] [ComputeTrace ι m τ] [Sync m n k] (info : ι) : Target ι n k τ :=
130
- mk <| sync <| (info, ·) <$> ComputeTrace.computeTrace info
131
-
132
- def computeAsync [Functor m] [ComputeTrace ι m τ] [Async m n k] (info : ι) : Target ι n k τ :=
133
- mk <| async <| (info, ·) <$> ComputeTrace.computeTrace info
134
-
135
- def activate [Functor n] (self : Target ι n k τ) : n (ActiveTarget ι k τ) :=
102
+ @[inline] def activate [Functor n] (self : Target ι n k τ) : n (ActiveTarget ι k τ) :=
136
103
(.mk ·) <$> self.task
137
104
138
- def materializeAsync [Functor n] [Functor k] (self : Target ι n k τ) : n (k τ) :=
105
+ @[inline] def materializeAsync [Functor n] [Functor k] (self : Target ι n k τ) : n (k τ) :=
139
106
((·.2 ) <$> ·) <$> self.task
140
107
141
108
def materialize [Await k m'] [MonadLiftT m' m] [MonadLiftT n m] [Functor m] [Bind m] (self : Target ι n k τ) : m τ :=
142
109
liftM self.task >>= fun t => (·.2 ) <$> liftM (await t)
143
110
144
- def build [Await k m'] [MonadLiftT m' m] [MonadLiftT n m] [Functor m] [Bind m] (self : Target ι n k τ) : m ι :=
145
- liftM self.task >>= fun t => (·.1 ) <$> liftM (await t)
146
-
147
- def buildOpaque [Await k m'] [MonadLiftT m' m] [MonadLiftT n m] [Functor m] [Bind m] (self : Target ι n k τ) : m PUnit :=
148
- discard self.materialize
149
-
150
- def buildAsync [Functor n] [Functor k] (self : Target ι n k τ) : n (k ι) :=
151
- ((·.1 ) <$> ·) <$> self.task
152
-
153
- def buildOpaqueAsync [Functor n] [Functor k] (self : Target ι n k τ) : n (k PUnit) :=
154
- discard <$> self.task
155
-
156
- protected def bindSync [BindSync m n k] [Bind n] (self : Target ι n k τ) (f : ι → τ → m β) : n (k β) :=
111
+ @[inline] protected def bindSync [BindSync m n k] [Bind n]
112
+ (self : Target ι n k τ) (f : ι → τ → m β) : n (k β) :=
157
113
self.task >>= fun tk => bindSync tk fun (i,t) => f i t
158
114
159
- protected def bindOpaqueSync [BindSync m n k] [Bind n] (self : Target ι n k τ) (f : τ → m β) : n (k β) :=
115
+ @[inline] protected def bindOpaqueSync
116
+ [BindSync m n k] [Bind n] (self : Target ι n k τ) (f : τ → m β) : n (k β) :=
160
117
self.task >>= fun tk => bindSync tk fun (_,t) => f t
161
118
162
- protected def bindAsync [BindAsync n k] [Bind n] (self : Target ι n k τ) (f : ι → τ → n (k β)) : n (k β) :=
119
+ @[inline] protected def bindAsync
120
+ [BindAsync n k] [Bind n] (self : Target ι n k τ) (f : ι → τ → n (k β)) : n (k β) :=
163
121
self.task >>= fun tk => bindAsync tk fun (i,t) => f i t
164
122
165
- protected def bindOpaqueAsync [BindAsync n k] [Bind n] (self : Target ι n k τ) (f : τ → n (k β)) : n (k β) :=
123
+ @[inline] protected def bindOpaqueAsync
124
+ [BindAsync n k] [Bind n] (self : Target ι n k τ) (f : τ → n (k β)) : n (k β) :=
166
125
self.task >>= fun tk => bindAsync tk fun (_,t) => f t
167
126
168
127
def mixOpaqueAsync
169
128
[MixTrace τ] [SeqWithAsync n k] [Functor k] [Monad n]
170
- (t1 : Target α n k τ) (t2 : Target β n k τ) : Target PUnit n k τ :=
171
- mk do
172
- let tk1 ← t1.materializeAsync
173
- let tk2 ← t2.materializeAsync
174
- ((fun t => ((),t)) <$> ·) <$> seqWithAsync mixTrace tk1 tk2
129
+ (t1 : Target α n k τ) (t2 : Target β n k τ) : Target PUnit n k τ := mk do
130
+ let tk1 ← t1.materializeAsync
131
+ let tk2 ← t2.materializeAsync
132
+ ((fun t => ((),t)) <$> ·) <$> seqWithAsync mixTrace tk1 tk2
175
133
176
134
section
177
135
variable [NilTrace τ] [MixTrace τ]
178
-
179
- def materializeList [Await k m] [MonadLiftT n m] [Monad m] (targets : List (Target ι n k τ)) : m τ := do
180
- let tasks ← targets.mapM (·.task)
181
- tasks.foldlM (fun tr τ => return mixTrace tr (← liftM <| await τ).2 ) nilTrace
182
-
183
- def materializeArray [Await k m] [MonadLiftT n m] [Monad m] (targets : Array (Target ι n k τ)) : m τ := do
184
- let tasks ← targets.mapM (·.task)
185
- tasks.foldlM (fun tr τ => return mixTrace tr (← liftM <| await τ).2 ) nilTrace
186
-
187
136
variable [SeqWithAsync n' k] [Monad n'] [MonadLiftT n' n] [Monad n] [Pure k] [Functor k]
188
137
189
138
def materializeListAsync (targets : List (Target ι n k τ)) : n (k τ) := do
@@ -192,15 +141,15 @@ def materializeListAsync (targets : List (Target ι n k τ)) : n (k τ) := do
192
141
def materializeArrayAsync (targets : Array (Target ι n k τ)) : n (k τ) := do
193
142
liftM <| foldRightArrayAsync mixTrace nilTrace (← targets.mapM (·.materializeAsync))
194
143
195
- def collectList (targets : List (Target ι n k τ)) : Target (List ι) n k τ :=
196
- mk do
197
- let tasks ← targets.mapM (·.task )
198
- liftM <| foldLeftListAsync ( fun (i,t') (a,t) => (i :: a, mixTrace t t')) ([], nilTrace) tasks
144
+ def collectList (targets : List (Target ι n k τ)) : Target (List ι) n k τ := mk do
145
+ let tasks ← targets.mapM (·.task)
146
+ let f := fun (i,t') (a,t) => (i :: a, mixTrace t t' )
147
+ liftM <| foldLeftListAsync f ([], nilTrace) tasks
199
148
200
- def collectArray (targets : Array (Target ι n k τ)) : Target (Array ι) n k τ :=
201
- mk do
202
- let tasks ← targets.mapM (·.task )
203
- liftM <| foldRightArrayAsync ( fun (a,t) (i,t') => (a.push i, mixTrace t t')) (#[], nilTrace) tasks
149
+ def collectArray (targets : Array (Target ι n k τ)) : Target (Array ι) n k τ := mk do
150
+ let tasks ← targets.mapM (·.task)
151
+ let f := fun (a,t) (i,t') => (a.push i, mixTrace t t' )
152
+ liftM <| foldRightArrayAsync f (#[], nilTrace) tasks
204
153
205
154
def collectOpaqueList (targets : List (Target ι n k τ)) : Target PUnit n k τ :=
206
155
mk <| ((fun t => ((), t)) <$> ·) <$> materializeListAsync targets
0 commit comments