on 7414760 help sign in
elk/bench/src/ArrayBench.elm
90 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
38foldlMeanStddev = meanAndStddev Array.foldl
40customFoldrMeanStddev = meanAndStddev myFoldr
42customFoldlMeanStddev = meanAndStddev myFoldl
44updateNRandomIndices
45 : (Float -> Float)
46 -> List Int
47 -> Array.Array Float
48 -> Array.Array Float
49updateNRandomIndices f indexList startList =
50 List.foldr
51 (\ i oldList -> updateN i f oldList)
52 startList indexList
55randomLookups : List Int -> Array.Array Float -> List (Maybe Float)
56randomLookups indices arr =
57 List.map (\i -> Array.get i arr) indices
61myFoldl : (a -> b -> b) -> b -> Array.Array a -> b
62myFoldl f init arr =
63 let
64 len = Array.length arr
65 fromJust (Just x) = x
66 helper init i =
67 if (i >= len)
68 then init
69 else
70 helper (f (fromJust <| Array.get i arr) init) (i+1)
71 in helper init 0
74myFoldr : (a -> b -> b) -> b -> Array.Array a -> b
75myFoldr f init arr =
76 let
77 len = Array.length arr
78 fromJust (Just x) = x
79 helper init i =
80 if (i <= 0)
81 then init
82 else
83 helper (f (fromJust <| Array.get i arr) init) (i-1)
84 in helper init (len-1)
86updateN : Int -> (a -> a) -> Array.Array a -> Array.Array a
87updateN n f arr =
88 case Array.get n arr of
89 Just x -> Array.set n (f x) arr
90 _ -> crash "Array out of bounds"