Mirror: 馃帺 A tiny but capable push & pull stream library for TypeScript and Flow
at v4.0.0-rc.3 4.0 kB view raw
1type t('a) = array('a); 2 3let makeEmpty = (): t('a) => [||]; 4let makeUninitialized = Belt.Array.makeUninitializedUnsafe; 5let make = Belt.Array.make; 6 7let size = Belt.Array.size; 8let get = Belt.Array.get; 9let getUnsafe = Belt.Array.getUnsafe; 10let set = Belt.Array.set; 11let setUnsafe = Belt.Array.setUnsafe; 12 13let fill = (arr: t('a), x: 'a) => 14 Belt.Array.fill(arr, ~offset=0, ~len=size(arr), x); 15 16let reverseInPlace = Belt.Array.reverseInPlace; 17let reverse = Belt.Array.reverse; 18let shuffle = Belt.Array.shuffle; 19let shuffleInPlace = Belt.Array.shuffleInPlace; 20 21let copy = Belt.Array.copy; 22 23let slice = (arr: t('a), ~start: int, ~end_: int): t('a) => { 24 let len = end_ - start; 25 Belt.Array.slice(arr, ~offset=start, ~len); 26}; 27 28let concat = Belt.Array.concat; 29 30let append = (arr: t('a), x: 'a) => Belt.Array.concat(arr, [|x|]); 31 32let somei = (arr: t('a), f: ('a, int) => bool): bool => { 33 let len = size(arr); 34 let rec search = (i: int) => 35 if (i >= len) { 36 false; 37 } else if (f(getUnsafe(arr, i), i)) { 38 true; 39 } else { 40 search(i + 1); 41 }; 42 43 search(0); 44}; 45 46let everyi = (arr: t('a), f: ('a, int) => bool): bool => { 47 let len = size(arr); 48 let rec search = (i: int) => 49 if (i >= len) { 50 true; 51 } else if (!f(getUnsafe(arr, i), i)) { 52 false; 53 } else { 54 search(i + 1); 55 }; 56 57 search(0); 58}; 59 60let findi = (arr: t('a), f: ('a, int) => bool): option('a) => { 61 let len = size(arr); 62 let rec search = (i: int) => 63 if (i >= len) { 64 None; 65 } else { 66 let x = getUnsafe(arr, i); 67 if (f(x, i)) { 68 Some(x); 69 } else { 70 search(i + 1); 71 }; 72 }; 73 74 search(0); 75}; 76 77let findIndex = (arr: t('a), f: 'a => bool): int => { 78 let len = size(arr); 79 let rec search = (i: int) => 80 if (i >= len) { 81 (-1); 82 } else if (f(getUnsafe(arr, i))) { 83 i; 84 } else { 85 search(i + 1); 86 }; 87 88 search(0); 89}; 90 91let lastIndexOf = (arr: t('a), x: 'a): int => { 92 let len = size(arr); 93 let rec search = (i: int) => 94 if (i < 0) { 95 (-1); 96 } else if (x === getUnsafe(arr, i)) { 97 i; 98 } else { 99 search(i - 1); 100 }; 101 102 search(len - 1); 103}; 104 105let filteri = (arr: t('a), f: ('a, int) => bool): t('a) => { 106 let len = size(arr); 107 let res: t('a) = copy(arr); 108 let j = ref(-1); 109 110 let rec filter = (i: int) => 111 if (i >= len) { 112 Array.sub(res, 0, j^ + 1); 113 } else { 114 let x = getUnsafe(arr, i); 115 if (f(x, i)) { 116 j := j^ + 1; 117 Belt.Array.setUnsafe(arr, j^, x); 118 }; 119 120 filter(i + 1); 121 }; 122 123 filter(0); 124}; 125 126let removeCount = (arr: t('a), ~pos: int, ~count: int): t('a) => { 127 let len = size(arr); 128 let pos2 = pos + count - 1; 129 let res = Array.sub(arr, 0, len - count); 130 131 let rec copy = (i: int) => 132 if (i >= len) { 133 res; 134 } else if (i >= pos && i <= pos2) { 135 copy(i + 1); 136 } else { 137 let j = i > pos2 ? i - count : i; 138 Belt.Array.setUnsafe(arr, j, Belt.Array.getUnsafe(arr, i)); 139 copy(i + 1); 140 }; 141 142 copy(0); 143}; 144 145let find = (arr: t('a), f: 'a => bool): option('a) => 146 findi(arr, (x, _i) => f(x)); 147let indexOf = (arr: t('a), x: 'a): int => findIndex(arr, item => item === x); 148let includes = (arr: t('a), x: 'a): bool => 149 findIndex(arr, item => item === x) > (-1); 150let filter = (arr: t('a), f: 'a => bool): t('a) => 151 filteri(arr, (x, _i) => f(x)); 152let remove = (arr: t('a), index: int): t('a) => 153 removeCount(arr, ~pos=index, ~count=1); 154 155let some = Belt.Array.some; 156let every = Belt.Array.every; 157let map = Belt.Array.map; 158let mapi = (arr: t('a), f: ('a, int) => 'b): t('b) => 159 Belt.Array.mapWithIndexU(arr, (. i, x) => f(x, i)); 160let forEach = Belt.Array.forEach; 161let forEachi = (arr: t('a), f: ('a, int) => unit): unit => 162 Belt.Array.forEachWithIndexU(arr, (. i, x) => f(x, i)); 163let reduce = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b => 164 Belt.Array.reduce(arr, acc, reducer); 165let reduceRight = (arr: t('a), reducer: ('b, 'a) => 'b, acc: 'b): 'b => 166 Belt.Array.reduceReverse(arr, acc, reducer);