diff --git a/README.md b/README.md index d8ea50df..33d47122 100644 --- a/README.md +++ b/README.md @@ -33,14 +33,16 @@ drop :: forall a. Prim.Number -> [a] -> [a] - elem :: forall a. a -> [a] -> Prim.Boolean + elemIndex :: forall a. (Eq a) => a -> [a] -> Prim.Number - elemIndex :: forall a. a -> [a] -> Prim.Number - - elemLastIndex :: forall a. a -> [a] -> Prim.Number + elemLastIndex :: forall a. (Eq a) => a -> [a] -> Prim.Number filter :: forall a. (a -> Prim.Boolean) -> [a] -> [a] + findIndex :: forall a. (a -> Prim.Boolean) -> [a] -> Prim.Number + + findLastIndex :: forall a. (a -> Prim.Boolean) -> [a] -> Prim.Number + head :: forall a. [a] -> Maybe a init :: forall a. [a] -> Maybe [a] diff --git a/src/Data/Array.purs b/src/Data/Array.purs index 3444130b..d582cc4f 100644 --- a/src/Data/Array.purs +++ b/src/Data/Array.purs @@ -10,7 +10,8 @@ module Data.Array , map , mapMaybe , length - , elem + , findIndex + , findLastIndex , elemIndex , elemLastIndex , append @@ -81,26 +82,35 @@ foreign import length \ return xs.length;\ \}" :: forall a. [a] -> Number -foreign import elem - "function elem(e) {\ - \ return function (l) {\ - \ return l.indexOf(e) !== -1;\ +foreign import findIndex + "function findIndex (f) {\ + \ return function (arr) {\ + \ for (var i = 0, l = arr.length; i < l; i++) {\ + \ if (f(arr[i])) {\ + \ return i;\ + \ }\ + \ }\ + \ return -1;\ \ };\ - \}" :: forall a. a -> [a] -> Boolean + \}" :: forall a. (a -> Boolean) -> [a] -> Number -foreign import elemIndex - "function elemIndex (e) {\ - \ return function (l) {\ - \ return l.indexOf(e);\ +foreign import findLastIndex + "function findLastIndex (f) {\ + \ return function (arr) {\ + \ for (var i = arr.length - 1; i >= 0; i--) {\ + \ if (f(arr[i])) {\ + \ return i;\ + \ }\ + \ }\ + \ return -1;\ \ };\ - \}" :: forall a. a -> [a] -> Number + \}" :: forall a. (a -> Boolean) -> [a] -> Number -foreign import elemLastIndex - "function elemLastIndex (e) {\ - \ return function (l) {\ - \ return l.lastIndexOf(e);\ - \ };\ - \}" :: forall a. a -> [a] -> Number +elemIndex :: forall a. (Eq a) => a -> [a] -> Number +elemIndex x = findIndex ((==) x) + +elemLastIndex :: forall a. (Eq a) => a -> [a] -> Number +elemLastIndex x = findLastIndex ((==) x) foreign import append "function append (l1) {\