From a4bf08c42601244cf8805128b8b22c90d5324520 Mon Sep 17 00:00:00 2001 From: Phil Freeman Date: Sun, 8 Mar 2015 14:45:25 -0700 Subject: [PATCH] Add modifyAt --- README.md | 495 +++++++++++++++++++++++++++++++++++++------- src/Data/Array.purs | 6 + 2 files changed, 426 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index f08f2633..22c03f9a 100644 --- a/README.md +++ b/README.md @@ -2,160 +2,505 @@ ## Module Data.Array -### Type Class Instances +#### `(!!)` - instance altArray :: Alt Prim.Array +``` purescript +(!!) :: forall a. [a] -> Number -> Maybe a +``` - instance alternativeArray :: Alternative Prim.Array - instance applicativeArray :: Applicative Prim.Array +#### `snoc` - instance applyArray :: Apply Prim.Array +``` purescript +snoc :: forall a. [a] -> a -> [a] +``` - instance bindArray :: Bind Prim.Array - instance functorArray :: Functor Prim.Array +#### `singleton` - instance monadArray :: Monad Prim.Array +``` purescript +singleton :: forall a. a -> [a] +``` - instance monadPlusArray :: MonadPlus Prim.Array - instance plusArray :: Plus Prim.Array +#### `head` - instance semigroupArray :: Semigroup [a] +``` purescript +head :: forall a. [a] -> Maybe a +``` -### Values +#### `last` - (!!) :: forall a. [a] -> Number -> Maybe a +``` purescript +last :: forall a. [a] -> Maybe a +``` - (..) :: Number -> Number -> [Number] - (\\) :: forall a. (Eq a) => [a] -> [a] -> [a] +#### `tail` - append :: forall a. [a] -> [a] -> [a] +``` purescript +tail :: forall a. [a] -> Maybe [a] +``` - catMaybes :: forall a. [Maybe a] -> [a] - concat :: forall a. [[a]] -> [a] +#### `init` - concatMap :: forall a b. (a -> [b]) -> [a] -> [b] +``` purescript +init :: forall a. [a] -> Maybe [a] +``` - delete :: forall a. (Eq a) => a -> [a] -> [a] - deleteAt :: forall a. Number -> Number -> [a] -> [a] +#### `null` - deleteBy :: forall a. (a -> a -> Boolean) -> a -> [a] -> [a] +``` purescript +null :: forall a. [a] -> Boolean +``` - drop :: forall a. Number -> [a] -> [a] - dropWhile :: forall a. (a -> Boolean) -> [a] -> [a] +#### `length` - elemIndex :: forall a. (Eq a) => a -> [a] -> Number +``` purescript +length :: forall a. [a] -> Number +``` - elemLastIndex :: forall a. (Eq a) => a -> [a] -> Number - filter :: forall a. (a -> Boolean) -> [a] -> [a] +#### `findIndex` - findIndex :: forall a. (a -> Boolean) -> [a] -> Number +``` purescript +findIndex :: forall a. (a -> Boolean) -> [a] -> Number +``` - findLastIndex :: forall a. (a -> Boolean) -> [a] -> Number - group :: forall a. (Eq a) => [a] -> [[a]] +#### `findLastIndex` - group' :: forall a. (Ord a) => [a] -> [[a]] +``` purescript +findLastIndex :: forall a. (a -> Boolean) -> [a] -> Number +``` - groupBy :: forall a. (a -> a -> Boolean) -> [a] -> [[a]] - head :: forall a. [a] -> Maybe a +#### `elemIndex` - init :: forall a. [a] -> Maybe [a] +``` purescript +elemIndex :: forall a. (Eq a) => a -> [a] -> Number +``` - insertAt :: forall a. Number -> a -> [a] -> [a] - intersect :: forall a. (Eq a) => [a] -> [a] -> [a] +#### `elemLastIndex` - intersectBy :: forall a. (a -> a -> Boolean) -> [a] -> [a] -> [a] +``` purescript +elemLastIndex :: forall a. (Eq a) => a -> [a] -> Number +``` - last :: forall a. [a] -> Maybe a - length :: forall a. [a] -> Number +#### `append` - map :: forall a b. (a -> b) -> [a] -> [b] +``` purescript +append :: forall a. [a] -> [a] -> [a] +``` - mapMaybe :: forall a b. (a -> Maybe b) -> [a] -> [b] - nub :: forall a. (Eq a) => [a] -> [a] +#### `concat` - nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a] +``` purescript +concat :: forall a. [[a]] -> [a] +``` - null :: forall a. [a] -> Boolean - range :: Number -> Number -> [Number] +#### `reverse` - reverse :: forall a. [a] -> [a] +``` purescript +reverse :: forall a. [a] -> [a] +``` - singleton :: forall a. a -> [a] - snoc :: forall a. [a] -> a -> [a] +#### `drop` - sort :: forall a. (Ord a) => [a] -> [a] +``` purescript +drop :: forall a. Number -> [a] -> [a] +``` - sortBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] - span :: forall a. (a -> Boolean) -> [a] -> { rest :: [a], init :: [a] } +#### `take` - tail :: forall a. [a] -> Maybe [a] +``` purescript +take :: forall a. Number -> [a] -> [a] +``` - take :: forall a. Number -> [a] -> [a] - takeWhile :: forall a. (a -> Boolean) -> [a] -> [a] +#### `insertAt` - updateAt :: forall a. Number -> a -> [a] -> [a] +``` purescript +insertAt :: forall a. Number -> a -> [a] -> [a] +``` + + +#### `deleteAt` + +``` purescript +deleteAt :: forall a. Number -> Number -> [a] -> [a] +``` + + +#### `updateAt` + +``` purescript +updateAt :: forall a. Number -> a -> [a] -> [a] +``` + + +#### `modifyAt` + +``` purescript +modifyAt :: forall a. Number -> (a -> a) -> [a] -> [a] +``` + + +#### `deleteBy` + +``` purescript +deleteBy :: forall a. (a -> a -> Boolean) -> a -> [a] -> [a] +``` + + +#### `delete` + +``` purescript +delete :: forall a. (Eq a) => a -> [a] -> [a] +``` + + +#### `(\\)` + +``` purescript +(\\) :: forall a. (Eq a) => [a] -> [a] -> [a] +``` + + +#### `intersectBy` + +``` purescript +intersectBy :: forall a. (a -> a -> Boolean) -> [a] -> [a] -> [a] +``` + + +#### `intersect` + +``` purescript +intersect :: forall a. (Eq a) => [a] -> [a] -> [a] +``` + + +#### `concatMap` + +``` purescript +concatMap :: forall a b. (a -> [b]) -> [a] -> [b] +``` + + +#### `map` + +``` purescript +map :: forall a b. (a -> b) -> [a] -> [b] +``` + + +#### `mapMaybe` + +``` purescript +mapMaybe :: forall a b. (a -> Maybe b) -> [a] -> [b] +``` + + +#### `catMaybes` + +``` purescript +catMaybes :: forall a. [Maybe a] -> [a] +``` + + +#### `filter` + +``` purescript +filter :: forall a. (a -> Boolean) -> [a] -> [a] +``` + + +#### `range` + +``` purescript +range :: Number -> Number -> [Number] +``` + + +#### `(..)` + +``` purescript +(..) :: Number -> Number -> [Number] +``` + + +#### `zipWith` + +``` purescript +zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] +``` + + +#### `nub` + +``` purescript +nub :: forall a. (Eq a) => [a] -> [a] +``` + + +#### `nubBy` + +``` purescript +nubBy :: forall a. (a -> a -> Boolean) -> [a] -> [a] +``` + + +#### `sort` + +``` purescript +sort :: forall a. (Ord a) => [a] -> [a] +``` + + +#### `sortBy` + +``` purescript +sortBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] +``` + + +#### `group` + +``` purescript +group :: forall a. (Eq a) => [a] -> [[a]] +``` + + +#### `group'` + +``` purescript +group' :: forall a. (Ord a) => [a] -> [[a]] +``` + +Performs a sorting first. + +#### `groupBy` + +``` purescript +groupBy :: forall a. (a -> a -> Boolean) -> [a] -> [[a]] +``` + + +#### `span` + +``` purescript +span :: forall a. (a -> Boolean) -> [a] -> { rest :: [a], init :: [a] } +``` + + +#### `takeWhile` + +``` purescript +takeWhile :: forall a. (a -> Boolean) -> [a] -> [a] +``` + + +#### `dropWhile` + +``` purescript +dropWhile :: forall a. (a -> Boolean) -> [a] -> [a] +``` + + +#### `functorArray` + +``` purescript +instance functorArray :: Functor Prim.Array +``` + + +#### `applyArray` + +``` purescript +instance applyArray :: Apply Prim.Array +``` + + +#### `applicativeArray` + +``` purescript +instance applicativeArray :: Applicative Prim.Array +``` + + +#### `bindArray` + +``` purescript +instance bindArray :: Bind Prim.Array +``` + + +#### `monadArray` + +``` purescript +instance monadArray :: Monad Prim.Array +``` + + +#### `semigroupArray` + +``` purescript +instance semigroupArray :: Semigroup [a] +``` + + +#### `altArray` + +``` purescript +instance altArray :: Alt Prim.Array +``` + + +#### `plusArray` + +``` purescript +instance plusArray :: Plus Prim.Array +``` + + +#### `alternativeArray` + +``` purescript +instance alternativeArray :: Alternative Prim.Array +``` + + +#### `monadPlusArray` + +``` purescript +instance monadPlusArray :: MonadPlus Prim.Array +``` - zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] ## Module Data.Array.ST -### Types +#### `STArray` + +``` purescript +data STArray :: * -> * -> * +``` + + +#### `Assoc` + +``` purescript +type Assoc a = { index :: Number, value :: a } +``` + + +#### `runSTArray` + +``` purescript +runSTArray :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a] +``` + + +#### `emptySTArray` + +``` purescript +emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a) +``` + - type Assoc a = { index :: Number, value :: a } +#### `peekSTArray` - data STArray :: * -> * -> * +``` purescript +peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a) +``` -### Values +#### `pokeSTArray` - emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a) +``` purescript +pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean +``` - freeze :: forall a h r. STArray h a -> Eff (st :: ST h | r) [a] - peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a) +#### `pushAllSTArray` - pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean +``` purescript +pushAllSTArray :: forall a h r. STArray h a -> [a] -> Eff (st :: ST h | r) Number +``` - pushAllSTArray :: forall a h r. STArray h a -> [a] -> Eff (st :: ST h | r) Number - pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Number +#### `pushSTArray` - runSTArray :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a] +``` purescript +pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Number +``` - spliceSTArray :: forall a h r. STArray h a -> Number -> Number -> [a] -> Eff (st :: ST h | r) [a] - thaw :: forall a h r. [a] -> Eff (st :: ST h | r) (STArray h a) +#### `spliceSTArray` + +``` purescript +spliceSTArray :: forall a h r. STArray h a -> Number -> Number -> [a] -> Eff (st :: ST h | r) [a] +``` + + +#### `freeze` + +``` purescript +freeze :: forall a h r. STArray h a -> Eff (st :: ST h | r) [a] +``` + + +#### `thaw` + +``` purescript +thaw :: forall a h r. [a] -> Eff (st :: ST h | r) (STArray h a) +``` + + +#### `toAssocArray` + +``` purescript +toAssocArray :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a] +``` - toAssocArray :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a] ## Module Data.Array.Unsafe -### Values +#### `head` + +``` purescript +head :: forall a. [a] -> a +``` + + +#### `tail` + +``` purescript +tail :: forall a. [a] -> [a] +``` + + +#### `last` - head :: forall a. [a] -> a +``` purescript +last :: forall a. [a] -> a +``` - init :: forall a. [a] -> [a] - last :: forall a. [a] -> a +#### `init` - tail :: forall a. [a] -> [a] \ No newline at end of file +``` purescript +init :: forall a. [a] -> [a] +``` \ No newline at end of file diff --git a/src/Data/Array.purs b/src/Data/Array.purs index df162114..80d2a165 100644 --- a/src/Data/Array.purs +++ b/src/Data/Array.purs @@ -24,6 +24,7 @@ module Data.Array , insertAt , deleteAt , updateAt + , modifyAt , deleteBy , delete , (\\) @@ -205,6 +206,11 @@ foreign import updateAt \ };\ \}":: forall a. Number -> a -> [a] -> [a] +modifyAt :: forall a. Number -> (a -> a) -> [a] -> [a] +modifyAt i f xs = case xs !! i of + Just x -> updateAt i (f x) xs + Nothing -> xs + deleteBy :: forall a. (a -> a -> Boolean) -> a -> [a] -> [a] deleteBy _ _ [] = [] deleteBy eq x ys = case findIndex (eq x) ys of