1module ArrayBench where 2 3import Array 4import Random 5import Debug exposing (crash) 6 7 8 9randomArray 10 : Random.Generator a 11 -> Int 12 -> Random.Seed 13 -> Array.Array a 14randomArray gen n initSeed = 15 let 16 f n (seed, accum) = 17 let 18 (nextToAdd, newSeed) = Random.generate gen seed 19 newAccum = Array.push nextToAdd accum 20 in (newSeed, newAccum) 21 in 22 snd <| List.foldl f (initSeed, Array.empty) [1 .. n] 23 24meanAndStddev 25 : ((Float -> (Float, Float) -> (Float, Float)) -> (Float, Float) -> Array.Array Float -> (Float, Float)) 26 -> Array.Array Float 27 -> (Float, Float) 28meanAndStddev foldFn ourArray = 29 let 30 --ourArray = randomArray n (Random.initialSeed 23) 31 (theSum, sumSq) = foldFn (\x (sum, sumSq) -> (x + sum, (x^2) + sumSq) ) (0,0) ourArray 32 in 33 (theSum, sqrt(theSum*theSum - sumSq)) 34 35 36foldrMeanStddev = meanAndStddev Array.foldr 37 38 39foldlMeanStddev = meanAndStddev Array.foldl 40 41 42customFoldrMeanStddev = meanAndStddev myFoldr 43 44 45customFoldlMeanStddev = meanAndStddev myFoldl 46 47 48updateNRandomIndices 49 : (Float -> Float) 50 -> List Int 51 -> Array.Array Float 52 -> Array.Array Float 53updateNRandomIndices f indexList startList = 54 List.foldr 55 (\ i oldList -> updateN i f oldList) 56 startList indexList 57 58 59randomLookups : List Int -> Array.Array Float -> List (Maybe Float) 60randomLookups indices arr = 61 List.map (\i -> Array.get i arr) indices 62 63 64myFoldl : (a -> b -> b) -> b -> Array.Array a -> b 65myFoldl f init arr = 66 let 67 len = Array.length arr 68 fromJust (Just x) = x 69 helper init i = 70 if (i >= len) 71 then init 72 else 73 helper (f (fromJust <| Array.get i arr) init) (i+1) 74 in helper init 0 75 76 77myFoldr : (a -> b -> b) -> b -> Array.Array a -> b 78myFoldr f init arr = 79 let 80 len = Array.length arr 81 fromJust (Just x) = x 82 helper init i = 83 if (i <= 0) 84 then init 85 else 86 helper (f (fromJust <| Array.get i arr) init) (i-1) 87 in helper init (len-1) 88 89 90updateN : Int -> (a -> a) -> Array.Array a -> Array.Array a 91updateN n f arr = 92 case Array.get n arr of 93 Just x -> Array.set n (f x) arr 94 _ -> crash "Array out of bounds"