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"