module Problem1 where
-- a)
turn180 = left >>> left
right = left >>> turn180
backward = turn180 >>> forward >>> turn180
-- b)
Forward s >>> t = Forward (s >>> t)
TurnLeft s >>> t = TurnLeft (s >>> t)
IfObstructed s t >>> u = IfObstructed (s >>> u) (t >>> u)
Idle >>> s = s
-- c)
newtype S = S { unS :: Maze -> Ant -> Ant }
forward :: S
forward = S $ \maze ant ->
if obstructed maze ant
then ant
else moveAnt ant
ifObstructed :: S -> S -> S
ifObstructed (S s) (S t) = S $ \maze ant ->
if obstructed maze ant
then s maze ant
else t maze ant
idle :: S
idle = S $ \maze ant -> ant
left :: S
left = S $ \maze ant -> leftAnt ant
(>>>) :: S -> S -> S
S s >>> S t = S $ \maze ant -> t maze (s maze ant)
navigate :: Maze -> Ant -> S -> Ant
navigate maze ant (S s) = s maze ant