-
Notifications
You must be signed in to change notification settings - Fork 0
/
Utility.elm
126 lines (78 loc) · 2.22 KB
/
Utility.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
module Utility exposing (..)
import Html exposing (Html, div)
import Html.Attributes exposing (style)
import List
type alias PlayerID =
Int
--Common definition of a vector
type alias Coordinate =
{ x : Int, y : Int }
coordinateDistance : Coordinate -> Coordinate -> Float
coordinateDistance a b =
let
x = a.x - b.x
y = a.y - b.y
in
(x * x) + (y * y) |> toFloat |> sqrt
type alias Vector =
{ x : Int, y : Int }
zeroVector : Vector
zeroVector =
Vector 0 0
reverseVector : Vector -> Vector
reverseVector v =
scaleVector v -1
scaleVector : Vector -> Int -> Vector
scaleVector v n =
Vector (v.x * n) (v.y * n)
filterMaybe : List (Maybe a) -> List a
filterMaybe list =
List.foldr
(\elem acc ->
case elem of
Nothing ->
acc
Just elem ->
elem :: acc
)
[]
list
findFirst : (a -> Bool) -> List a -> Maybe a
findFirst filter l =
List.map (\e -> if filter e then Just e else Nothing) l
|> filterMaybe |> List.head
--Performs a list.Head operation, crashes if the list is empty.
unsafeHead : List a -> a
unsafeHead list =
unsafe (List.head list)
--Performs a List.Tail operation, crashes if the list is empty.
unsafeTail : List a -> List a
unsafeTail list =
unsafe (List.tail list)
--Forces a value from a Maybe, crashes if the maybe is nothing.
--Useful in instances where it is contextually impossible to get
--"Nothing" out of an operation, such as a List.head when the list
--was already checked to be non-empty.
unsafe : Maybe a -> a
unsafe x =
case x of
Just safe ->
safe
Nothing ->
Debug.crash "unsafe operation failed!"
--Tests if a list contains a specific element using the
-- '==' comparator
listContains : List a -> a -> Bool
listContains l e =
List.any (\b -> e == b) l
--Removes all instances of element 'e' from list 'l'
listRemove : List a -> a -> List a
listRemove l e =
List.filter (\b -> e /= b) l
listUpdate : (a -> Bool) -> List a -> a -> List a
listUpdate identifier l e =
e
:: (List.filter
(\i -> not (identifier i))
l
)