on 2d29699 help sign in
elk/bench/src/ArrayBench.elm
94 lines 2.1 kB history raw
1module ArrayBench where
3import Array
4import Random
5import Debug exposing (crash)
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]
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))
36foldrMeanStddev = meanAndStddev Array.foldr
39foldlMeanStddev = meanAndStddev Array.foldl
42customFoldrMeanStddev = meanAndStddev myFoldr
45customFoldlMeanStddev = meanAndStddev myFoldl
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
59randomLookups : List Int -> Array.Array Float -> List (Maybe Float)
60randomLookups indices arr =
61 List.map (\i -> Array.get i arr) indices
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
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)
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"