Skip to content

Commit 51a712f

Browse files
pecherskykim-em
andcommitted
feat: port Init.Control.Combinators (#530)
- TODO: check if List.mfirst align is correct Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
1 parent d1bae74 commit 51a712f

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import Mathlib.Init.Algebra.Order
6060
import Mathlib.Init.Align
6161
import Mathlib.Init.CcLemmas
6262
import Mathlib.Init.Classical
63+
import Mathlib.Init.Control.Combinators
6364
import Mathlib.Init.Core
6465
import Mathlib.Init.Data.Bool.Basic
6566
import Mathlib.Init.Data.Bool.Lemmas
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/-
2+
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jeremy Avigad, Leonardo de Moura
5+
-/
6+
import Std.Data.List.Init.Lemmas
7+
import Mathlib.Mathport.Rename
8+
9+
/-! ## Monad combinators, as in Haskell's Control.Monad. -/
10+
11+
universe u v w
12+
13+
#align list.mmap List.mapM
14+
15+
#align list.mmap' List.mapM'
16+
17+
def joinM {m : Type u → Type u} [Monad m] {α : Type u} (a : m (m α)) : m α :=
18+
bind a id
19+
20+
#align mjoin joinM
21+
22+
#align list.mfilter List.filterM
23+
24+
#align list.mfoldl List.foldlM
25+
26+
#align list.mfoldr List.foldrM
27+
28+
#align list.mfirst List.firstM
29+
30+
def when {m : TypeType} [Monad m] (c : Prop) [Decidable c] (t : m Unit) : m Unit :=
31+
ite c t (pure ())
32+
33+
def condM {m : TypeType} [Monad m] {α : Type} (mbool : m Bool) (tm fm : m α) : m α := do
34+
let b ← mbool
35+
cond b tm fm
36+
37+
#align mcond condM
38+
39+
def whenM {m : TypeType} [Monad m] (c : m Bool) (t : m Unit) : m Unit :=
40+
condM c t (return ())
41+
42+
#align mwhen whenM
43+
44+
45+
export List (mapM mapM' filterM foldlM)
46+
47+
namespace Monad
48+
49+
def mapM :=
50+
@List.mapM
51+
#align monad.mapm Monad.mapM
52+
53+
def mapM' :=
54+
@List.mapM'
55+
#align monad.mapm' Monad.mapM'
56+
57+
def join :=
58+
@joinM
59+
60+
def filter :=
61+
@filterM
62+
63+
def foldl :=
64+
@List.foldlM
65+
66+
def cond :=
67+
@condM
68+
69+
def sequence {m : Type u → Type v} [Monad m] {α : Type u} : List (m α) → m (List α)
70+
| [] => return []
71+
| h :: t => do
72+
let h' ← h
73+
let t' ← sequence t
74+
return (h' :: t')
75+
76+
def sequence' {m : TypeType u} [Monad m] {α : Type} : List (m α) → m Unit
77+
| [] => return ()
78+
| h :: t => h *> sequence' t
79+
80+
def whenb {m : TypeType} [Monad m] (b : Bool) (t : m Unit) : m Unit :=
81+
_root_.cond b t (return ())
82+
83+
def unlessb {m : TypeType} [Monad m] (b : Bool) (t : m Unit) : m Unit :=
84+
_root_.cond b (return ()) t
85+
86+
end Monad

scripts/nolints.json

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
["docBlame", "bit1"],
4545
["docBlame", "decidable_eq_of_bool_pred"],
4646
["docBlame", "instHNeg"],
47+
["docBlame", "condM"],
48+
["docBlame", "joinM"],
49+
["docBlame", "whenM"],
4750
["docBlame", "setOf"],
4851
["docBlame", "«term_+ᵥ_»"],
4952
["docBlame", "«term_-ᵥ_»"],
@@ -57,6 +60,9 @@
5760
["docBlame", "to_additive_ignore_args"],
5861
["docBlame", "to_additive_relevant_arg"],
5962
["docBlame", "to_additive_reorder"],
63+
["docBlame", "variables"],
64+
["docBlame", "when"],
65+
["docBlame", "AddCancelCommMonoid.add_comm"],
6066
["docBlame", "AddCancelCommMonoid.toCancelMonoid"],
6167
["docBlame", "AddCancelMonoid.add_right_cancel"],
6268
["docBlame", "AddCommGroup.toCancelCommMonoid"],
@@ -193,8 +199,24 @@
193199
["docBlame", "List.card"],
194200
["docBlame", "List.equiv"],
195201
["docBlame", "List.inj_on"],
202+
["docBlame", "List.mfilter"],
203+
["docBlame", "List.mfirst"],
204+
["docBlame", "List.mfoldl"],
205+
["docBlame", "List.mfoldr"],
206+
["docBlame", "List.mmap"],
207+
["docBlame", "List.mmap'"],
196208
["docBlame", "List.remove"],
197209
["docBlame", "List.«term_~_»"],
210+
["docBlame", "Monad.cond"],
211+
["docBlame", "Monad.filter"],
212+
["docBlame", "Monad.foldl"],
213+
["docBlame", "Monad.join"],
214+
["docBlame", "Monad.mapM"],
215+
["docBlame", "Monad.mapM'"],
216+
["docBlame", "Monad.sequence"],
217+
["docBlame", "Monad.sequence'"],
218+
["docBlame", "Monad.unlessb"],
219+
["docBlame", "Monad.whenb"],
198220
["docBlame", "MonadWriter.listen"],
199221
["docBlame", "MonadWriter.pass"],
200222
["docBlame", "MonadWriter.tell"],
@@ -698,4 +720,4 @@
698720
["docBlame", "Lean.Parser.Tactic.rcasesPat.explicit"],
699721
["docBlame", "Mathlib.Tactic.Sat.buildReify.mkPS"],
700722
["unusedArguments", "Combinator.K"],
701-
["unusedArguments", "Decidable.not_or_iff_and_not"]]
723+
["unusedArguments", "Decidable.not_or_iff_and_not"]]

0 commit comments

Comments
 (0)