-
Notifications
You must be signed in to change notification settings - Fork 0
/
Person.hs
52 lines (41 loc) · 1.2 KB
/
Person.hs
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
module Person where
import Data.List
import Location
import Utils
type PersonName = String
data Person = Person
{ name :: PersonName
, locations :: [Location]
} deriving (Show, Eq)
getPersonWithName :: String -> [Person] -> Maybe Person
getPersonWithName personName = find ((==) personName . name)
addLocation :: Location -> Person -> Person
addLocation location person =
person
{ locations = locations person ++ [location]
}
isPersonInLocation :: String -> Person -> String
isPersonInLocation locationName person =
let
location = Position locationName
prevLocations = lastN 3 $ locations person
either l l2 =
if l == location || l2 == location then
"maybe"
else "no"
in
case prevLocations of
[OneOfTwo (l, l2), Known loc2, NoLonger loc3] ->
if loc2 == loc3 && (l == location || l2 == location) then
"maybe"
else
"no"
[Known loc, Known loc2, NoLonger loc3] ->
if loc2 == loc3 && loc == location then
"maybe"
else
"no"
history -> case last' history of
Just (OneOfTwo (l, l2)) -> either l l2
Just (Known l) -> boolToAnswer $ l == location
_ -> "no"