diff --git a/src/Init/Data/List/BasicAux.lean b/src/Init/Data/List/BasicAux.lean index 0dbdf63d7dda..50330998ae0c 100644 --- a/src/Init/Data/List/BasicAux.lean +++ b/src/Init/Data/List/BasicAux.lean @@ -157,6 +157,13 @@ def getLastD : (as : List α) → (fallback : α) → α | [], a₀ => a₀ | a::as, _ => getLast (a::as) (fun h => List.noConfusion h) +/-- +`O(n)`. Rotates the elements of `xs` to the left such that the element at +`xs[i]` rotates to `xs[(i - n) % l.length]`. +* `rotateLeft [1, 2, 3, 4, 5] 3 = [4, 5, 1, 2, 3]` +* `rotateLeft [1, 2, 3, 4, 5] 5 = [1, 2, 3, 4, 5]` +* `rotateLeft [1, 2, 3, 4, 5] = [2, 3, 4, 5, 1]` +-/ def rotateLeft (xs : List α) (n : Nat := 1) : List α := let len := xs.length if len ≤ 1 then @@ -167,6 +174,13 @@ def rotateLeft (xs : List α) (n : Nat := 1) : List α := let e := xs.drop n e ++ b +/-- +`O(n)`. Rotates the elements of `xs` to the right such that the element at +`xs[i]` rotates to `xs[(i + n) % l.length]`. +* `rotateRight [1, 2, 3, 4, 5] 3 = [3, 4, 5, 1, 2]` +* `rotateRight [1, 2, 3, 4, 5] 5 = [1, 2, 3, 4, 5]` +* `rotateRight [1, 2, 3, 4, 5] = [5, 1, 2, 3, 4]` +-/ def rotateRight (xs : List α) (n : Nat := 1) : List α := let len := xs.length if len ≤ 1 then @@ -297,6 +311,15 @@ def mapMono (as : List α) (f : α → α) : List α := Monadic generalization of `List.partition`. This uses `Array.toList` and which isn't imported by `Init.Data.List.Basic`. +``` +def posOrNeg (x : Int) : Except String Bool := + if x > 0 then pure true + else if x < 0 then pure false + else throw "Zero is not positive or negative" + +partitionM posOrNeg [-1, 2, 3] = Except.ok ([2, 3], [-1]) +partitionM posOrNeg [0, 2, 3] = Except.error "Zero is not positive or negative" +``` -/ @[inline] def partitionM [Monad m] (p : α → m Bool) (l : List α) : m (List α × List α) := go l #[] #[]