{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE BangPatterns #-}
module Graphics.WorldTurtle.Commands
(
Turtle
, P.Point
, makeTurtle
, makeTurtle'
, clear
, sleep
, forward
, fd
, backward
, bk
, left
, lt
, right
, rt
, Graphics.WorldTurtle.Commands.circle
, Graphics.WorldTurtle.Commands.arc
, jump
, goto
, home
, setHeading
, setSpeed
, setRotationSpeed
, wait
, repeatFor
, stamp
, representation
, label
, label'
, position
, heading
, speed
, rotationSpeed
, penColor
, penDown
, penSize
, visible
, branch
, setPenColor
, setPenDown
, setPenUp
, setPenSize
, setRepresentation
, setVisible
, setInvisible
, east
, north
, west
, south
) where
import Data.Maybe (fromMaybe)
import Control.Lens
import Control.Monad
import Control.Monad.Trans.Class (lift)
import Graphics.WorldTurtle.Shapes
import Graphics.WorldTurtle.Internal.Commands
import Graphics.WorldTurtle.Internal.Sequence
import qualified Graphics.WorldTurtle.Internal.Turtle as T
import qualified Graphics.WorldTurtle.Internal.Coords as P
import Graphics.Gloss.Data.Color (Color, black)
import Graphics.Gloss.Data.Picture
makeTurtle :: WorldCommand Turtle
makeTurtle :: WorldCommand Turtle
makeTurtle = SequenceCommand Turtle -> WorldCommand Turtle
forall a. SequenceCommand a -> WorldCommand a
WorldCommand SequenceCommand Turtle
generateTurtle
makeTurtle' :: Point
-> Float
-> Color
-> WorldCommand Turtle
makeTurtle' :: Point -> Float -> Color -> WorldCommand Turtle
makeTurtle' Point
p Float
f Color
c = SequenceCommand Turtle -> WorldCommand Turtle
forall a. SequenceCommand a -> WorldCommand a
WorldCommand (SequenceCommand Turtle -> WorldCommand Turtle)
-> SequenceCommand Turtle -> WorldCommand Turtle
forall a b. (a -> b) -> a -> b
$ do
Turtle
turtle <- SequenceCommand Turtle
generateTurtle
let ts :: (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts = Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ do
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Point
p
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Float -> Identity Float) -> TurtleData -> Identity TurtleData)
-> (Float -> Identity Float)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> Identity Float) -> TurtleData -> Identity TurtleData
Lens' TurtleData Float
T.heading ((Float -> Identity Float) -> TSC -> Identity TSC)
-> Float -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Float
f
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Picture -> Identity Picture)
-> TurtleData -> Identity TurtleData)
-> (Picture -> Identity Picture)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Picture -> Identity Picture) -> TurtleData -> Identity TurtleData
Lens' TurtleData Picture
T.representation ((Picture -> Identity Picture) -> TSC -> Identity TSC)
-> Picture -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Color -> Color -> Picture
turtleArrow Color
black Color
c
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Color -> Identity Color) -> TurtleData -> Identity TurtleData)
-> (Color -> Identity Color)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Color -> Identity Color) -> TurtleData -> Identity TurtleData
Lens' TurtleData Color
T.penColor ((Color -> Identity Color) -> TSC -> Identity TSC)
-> Color -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Color
c
Turtle -> SequenceCommand Turtle
forall (m :: * -> *) a. Monad m => a -> m a
return Turtle
turtle
backward :: Float
-> TurtleCommand ()
backward :: Float -> TurtleCommand ()
backward Float
d = Float -> TurtleCommand ()
forward (-Float
d)
bk :: Float -> TurtleCommand ()
bk :: Float -> TurtleCommand ()
bk = Float -> TurtleCommand ()
backward
calculateNewPointF_ :: P.Point
-> Float
-> Float
-> Float
-> P.Point
calculateNewPointF_ :: Point -> Float -> Float -> Float -> Point
calculateNewPointF_ !Point
p !Float
d !Float
h !Float
q = let !vec :: Point
vec = Float -> Point -> Point
P.rotateV (Float -> Float
P.degToRad Float
h) (Float
d, Float
0)
!endP :: Point
endP = Point
vec Point -> Point -> Point
P.+ Point
p
in Float -> Point -> Point -> Point
P.lerp Float
q Point
p Point
endP
forward :: Float
-> TurtleCommand ()
forward :: Float -> TurtleCommand ()
forward !Float
d = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
Float
-> Float
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a.
Float -> Float -> (Float -> SequenceCommand a) -> SequenceCommand a
animate' Float
d (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.speed) ((Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ \ Float
q -> do
let !startP :: Point
startP = TurtleData
t TurtleData -> Getting Point TurtleData Point -> Point
forall s a. s -> Getting a s a -> a
^. Getting Point TurtleData Point
Lens' TurtleData Point
T.position
let !midP :: Point
midP = Point -> Float -> Float -> Float -> Point
calculateNewPointF_ Point
startP Float
d (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.heading) Float
q
Bool
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TurtleData
t TurtleData -> Getting Bool TurtleData Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool TurtleData Bool
Lens' TurtleData Bool
T.penDown) (Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$
Picture -> Coroutine (Request TSC Float) TurtleState ()
addPicture (Picture -> Coroutine (Request TSC Float) TurtleState ())
-> Picture -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
color (TurtleData
t TurtleData -> Getting Color TurtleData Color -> Color
forall s a. s -> Getting a s a -> a
^. Getting Color TurtleData Color
Lens' TurtleData Color
T.penColor)
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Point -> Point -> Float -> Picture
thickLine Point
startP Point
midP (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.penSize)
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Point
midP
fd :: Float -> TurtleCommand ()
fd :: Float -> TurtleCommand ()
fd = Float -> TurtleCommand ()
forward
stamp :: TurtleCommand ()
stamp :: TurtleCommand ()
stamp = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ Turtle -> SequenceCommand TurtleData
tData_ (Turtle -> SequenceCommand TurtleData)
-> (TurtleData -> Coroutine (Request TSC Float) TurtleState ())
-> Turtle
-> Coroutine (Request TSC Float) TurtleState ()
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> (Picture -> Coroutine (Request TSC Float) TurtleState ()
addPicture (Picture -> Coroutine (Request TSC Float) TurtleState ())
-> (TurtleData -> Picture)
-> TurtleData
-> Coroutine (Request TSC Float) TurtleState ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TurtleData -> Picture
T.drawTurtle)
label :: String
-> TurtleCommand ()
label :: String -> TurtleCommand ()
label = Float -> String -> TurtleCommand ()
label' Float
0.2
label' :: Float
-> String
-> TurtleCommand ()
label' :: Float -> String -> TurtleCommand ()
label' Float
s String
txt = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
let (Float
x, Float
y) = TurtleData
t TurtleData -> Getting Point TurtleData Point -> Point
forall s a. s -> Getting a s a -> a
^. Getting Point TurtleData Point
Lens' TurtleData Point
T.position
Picture -> Coroutine (Request TSC Float) TurtleState ()
addPicture (Picture -> Coroutine (Request TSC Float) TurtleState ())
-> Picture -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
translate Float
x Float
y
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
scale Float
s Float
s
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
color (TurtleData
t TurtleData -> Getting Color TurtleData Color -> Color
forall s a. s -> Getting a s a -> a
^. Getting Color TurtleData Color
Lens' TurtleData Color
T.penColor)
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ String -> Picture
text String
txt
right :: Float
-> TurtleCommand ()
right :: Float -> TurtleCommand ()
right = Bool -> Float -> TurtleCommand ()
rotateTo_ Bool
True
rt :: Float -> TurtleCommand ()
rt :: Float -> TurtleCommand ()
rt = Float -> TurtleCommand ()
right
left :: Float
-> TurtleCommand ()
left :: Float -> TurtleCommand ()
left = Bool -> Float -> TurtleCommand ()
rotateTo_ Bool
False
lt :: Float -> TurtleCommand ()
lt :: Float -> TurtleCommand ()
lt = Float -> TurtleCommand ()
left
rotateTo_ :: Bool
-> Float
-> TurtleCommand ()
rotateTo_ :: Bool -> Float -> TurtleCommand ()
rotateTo_ !Bool
rightBias !Float
r = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
let !r' :: Float
r' = Float -> Float
P.normalizeHeading (Float -> Float
forall a. Num a => a -> a
abs Float
r)
let rotSpeed :: Float
rotSpeed = TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.rotationSpeed
Float
-> Float
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a.
Float -> Float -> (Float -> SequenceCommand a) -> SequenceCommand a
animate' Float
r' Float
rotSpeed ((Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ \Float
q -> do
let h :: Float
h = TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.heading
let bias :: Float
bias = if Bool
rightBias then -Float
1 else Float
1
let bias' :: Float
bias' = Float
bias Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float -> Float
forall a. Num a => a -> a
signum Float
rotSpeed
let bias'' :: Float
bias'' = Float
bias' Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float -> Float
forall a. Num a => a -> a
signum Float
r
let newHeading :: Float
newHeading = Float -> Float
P.normalizeHeading (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ Float
h Float -> Float -> Float
forall a. Num a => a -> a -> a
+ (Float
q Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
r') Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
bias''
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Float -> Identity Float) -> TurtleData -> Identity TurtleData)
-> (Float -> Identity Float)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> Identity Float) -> TurtleData -> Identity TurtleData
Lens' TurtleData Float
T.heading ((Float -> Identity Float) -> TSC -> Identity TSC)
-> Float -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Float
newHeading
circle :: Float
-> TurtleCommand ()
circle :: Float -> TurtleCommand ()
circle Float
radius = Float -> Float -> TurtleCommand ()
Graphics.WorldTurtle.Commands.arc Float
radius Float
360
drawCircle_ :: P.Point
-> Float
-> Float
-> Float
-> Float
-> Color
-> Picture
drawCircle_ :: Point -> Float -> Float -> Float -> Float -> Color -> Picture
drawCircle_ !Point
p !Float
radius !Float
startAngle !Float
endAngle !Float
pSize !Color
pColor =
(Float -> Float -> Picture -> Picture)
-> Point -> Picture -> Picture
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Float -> Float -> Picture -> Picture
translate Point
p (Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Picture -> Picture
rotate (Float
180 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
startAngle)
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
translate (-Float
radius) Float
0
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
color Color
pColor
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
scale (if Float
radius Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>= Float
0 then Float
1 else -Float
1) Float
1
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Float -> Float -> Picture
thickArc Float
0 Float
endAngle (Float -> Float
forall a. Num a => a -> a
abs Float
radius) Float
pSize
calculateNewPointC_ :: P.Point
-> Float
-> Float
-> Float
-> P.Point
calculateNewPointC_ :: Point -> Float -> Float -> Float -> Point
calculateNewPointC_ !Point
p !Float
radius !Float
startAngle !Float
angle =
let !px :: Float
px = Point -> Float
forall a b. (a, b) -> a
fst Point
p Float -> Float -> Float
forall a. Num a => a -> a -> a
- (Float
radius Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float -> Float
forall a. Floating a => a -> a
cos Float
a Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float -> Float
forall a. Floating a => a -> a
cos Float
s))
!py :: Float
py = Point -> Float
forall a b. (a, b) -> b
snd Point
p Float -> Float -> Float
forall a. Num a => a -> a -> a
- (Float
radius Float -> Float -> Float
forall a. Num a => a -> a -> a
* (Float -> Float
forall a. Floating a => a -> a
sin Float
a Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float -> Float
forall a. Floating a => a -> a
sin Float
s))
!s :: Float
s = Float -> Float
P.degToRad Float
startAngle
!a :: Float
a = Float -> Float
P.degToRad (Float -> Float) -> Float -> Float
forall a b. (a -> b) -> a -> b
$ if Float
radius Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>= Float
0 then Float
startAngle Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
angle
else Float
startAngle Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
angle
in (Float
px, Float
py)
arc :: Float
-> Float
-> TurtleCommand ()
arc :: Float -> Float -> TurtleCommand ()
arc !Float
radius !Float
r = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
let !r' :: Float
r' = Float -> Float
P.normalizeHeading Float
r
Float
-> Float
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a.
Float -> Float -> (Float -> SequenceCommand a) -> SequenceCommand a
animate' (Float -> Float
forall a. Num a => a -> a
abs Float
radius Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float -> Float
P.degToRad Float
r') (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.speed) ((Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ \ Float
q -> do
let !startAngle :: Float
startAngle = TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.heading Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
90
let !p :: Point
p = TurtleData
t TurtleData -> Getting Point TurtleData Point -> Point
forall s a. s -> Getting a s a -> a
^. Getting Point TurtleData Point
Lens' TurtleData Point
T.position
let !angle :: Float
angle = Float
r' Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
q
Bool
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TurtleData
t TurtleData -> Getting Bool TurtleData Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool TurtleData Bool
Lens' TurtleData Bool
T.penDown) (Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$
Picture -> Coroutine (Request TSC Float) TurtleState ()
addPicture (Picture -> Coroutine (Request TSC Float) TurtleState ())
-> Picture -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Point -> Float -> Float -> Float -> Float -> Color -> Picture
drawCircle_ Point
p Float
radius Float
startAngle Float
angle
(TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.penSize) (TurtleData
t TurtleData -> Getting Color TurtleData Color -> Color
forall s a. s -> Getting a s a -> a
^. Getting Color TurtleData Color
Lens' TurtleData Color
T.penColor)
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ do
let ts :: (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts = Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Float -> Identity Float) -> TurtleData -> Identity TurtleData)
-> (Float -> Identity Float)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> Identity Float) -> TurtleData -> Identity TurtleData
Lens' TurtleData Float
T.heading ((Float -> Identity Float) -> TSC -> Identity TSC)
-> Float -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Float -> Float
P.normalizeHeading (if Float
radius Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
>= Float
0
then Float
startAngle Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
90 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
angle
else Float
startAngle Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
90 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
angle)
let !p' :: Point
p' = Point -> Float -> Float -> Float -> Point
calculateNewPointC_ Point
p Float
radius Float
startAngle Float
angle
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Point
p'
position :: TurtleCommand P.Point
position :: TurtleCommand Point
position = Point -> Lens' TurtleData Point -> TurtleCommand Point
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ (Float
0, Float
0) Lens' TurtleData Point
T.position
home :: TurtleCommand ()
home :: TurtleCommand ()
home = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
let ts :: (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts = Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ do
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= (Float
0, Float
0)
(TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
ts ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Float -> Identity Float) -> TurtleData -> Identity TurtleData)
-> (Float -> Identity Float)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float -> Identity Float) -> TurtleData -> Identity TurtleData
Lens' TurtleData Float
T.heading ((Float -> Identity Float) -> TSC -> Identity TSC)
-> Float -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Float
90
jump :: P.Point
-> TurtleCommand ()
jump :: Point -> TurtleCommand ()
jump Point
point = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Point
point
goto :: P.Point
-> TurtleCommand ()
goto :: Point -> TurtleCommand ()
goto !Point
point = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
let d :: Float
d = Point -> Float
P.magV (Point -> Float) -> Point -> Float
forall a b. (a -> b) -> a -> b
$ TurtleData
t TurtleData -> Getting Point TurtleData Point -> Point
forall s a. s -> Getting a s a -> a
^. Getting Point TurtleData Point
Lens' TurtleData Point
T.position Point -> Point -> Point
P.- Point
point
Float
-> Float
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a.
Float -> Float -> (Float -> SequenceCommand a) -> SequenceCommand a
animate' Float
d (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.speed) ((Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ \ Float
q -> do
let !startP :: Point
startP = TurtleData
t TurtleData -> Getting Point TurtleData Point -> Point
forall s a. s -> Getting a s a -> a
^. Getting Point TurtleData Point
Lens' TurtleData Point
T.position
let !midP :: Point
midP = Float -> Point -> Point -> Point
P.lerp Float
q Point
startP Point
point
Bool
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TurtleData
t TurtleData -> Getting Bool TurtleData Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool TurtleData Bool
Lens' TurtleData Bool
T.penDown) (Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ())
-> Coroutine (Request TSC Float) TurtleState ()
-> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$
Picture -> Coroutine (Request TSC Float) TurtleState ()
addPicture (Picture -> Coroutine (Request TSC Float) TurtleState ())
-> Picture -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Color -> Picture -> Picture
color (TurtleData
t TurtleData -> Getting Color TurtleData Color -> Color
forall s a. s -> Getting a s a -> a
^. Getting Color TurtleData Color
Lens' TurtleData Color
T.penColor)
(Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Point -> Point -> Float -> Picture
thickLine Point
startP Point
midP (TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
T.penSize)
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((Point -> Identity Point) -> TurtleData -> Identity TurtleData)
-> (Point -> Identity Point)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Point -> Identity Point) -> TurtleData -> Identity TurtleData
Lens' TurtleData Point
T.position ((Point -> Identity Point) -> TSC -> Identity TSC)
-> Point -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= Point
midP
heading :: TurtleCommand Float
heading :: TurtleCommand Float
heading = Float -> Lens' TurtleData Float -> TurtleCommand Float
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Float
0 Lens' TurtleData Float
T.heading
setHeading :: Float
-> TurtleCommand ()
setHeading :: Float -> TurtleCommand ()
setHeading = Lens' TurtleData Float -> Float -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Float
T.heading
penColor :: TurtleCommand Color
penColor :: TurtleCommand Color
penColor = Color -> Lens' TurtleData Color -> TurtleCommand Color
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Color
black Lens' TurtleData Color
T.penColor
setPenColor :: Color
-> TurtleCommand ()
setPenColor :: Color -> TurtleCommand ()
setPenColor = Lens' TurtleData Color -> Color -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Color
T.penColor
penDown :: TurtleCommand Bool
penDown :: TurtleCommand Bool
penDown = Bool -> Lens' TurtleData Bool -> TurtleCommand Bool
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Bool
False Lens' TurtleData Bool
T.penDown
setPenDown :: TurtleCommand ()
setPenDown :: TurtleCommand ()
setPenDown = Lens' TurtleData Bool -> Bool -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Bool
T.penDown Bool
True
setPenUp :: TurtleCommand ()
setPenUp :: TurtleCommand ()
setPenUp = Lens' TurtleData Bool -> Bool -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Bool
T.penDown Bool
False
penSize :: TurtleCommand Float
penSize :: TurtleCommand Float
penSize = Float -> Lens' TurtleData Float -> TurtleCommand Float
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Float
0 Lens' TurtleData Float
T.penSize
setPenSize :: Float
-> TurtleCommand ()
setPenSize :: Float -> TurtleCommand ()
setPenSize = Lens' TurtleData Float -> Float -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Float
T.penSize
visible :: TurtleCommand Bool
visible :: TurtleCommand Bool
visible = Bool -> Lens' TurtleData Bool -> TurtleCommand Bool
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Bool
False Lens' TurtleData Bool
T.visible
setVisible :: TurtleCommand ()
setVisible :: TurtleCommand ()
setVisible = Lens' TurtleData Bool -> Bool -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Bool
T.visible Bool
True
setInvisible :: TurtleCommand ()
setInvisible :: TurtleCommand ()
setInvisible = Lens' TurtleData Bool -> Bool -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Bool
T.visible Bool
False
speed :: TurtleCommand Float
speed :: TurtleCommand Float
speed = Float -> Lens' TurtleData Float -> TurtleCommand Float
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Float
0 Lens' TurtleData Float
T.speed
setSpeed :: Float
-> TurtleCommand ()
setSpeed :: Float -> TurtleCommand ()
setSpeed = Lens' TurtleData Float -> Float -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Float
T.speed
rotationSpeed :: TurtleCommand Float
rotationSpeed :: TurtleCommand Float
rotationSpeed = Float -> Lens' TurtleData Float -> TurtleCommand Float
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Float
0 Lens' TurtleData Float
T.rotationSpeed
setRotationSpeed :: Float
-> TurtleCommand ()
setRotationSpeed :: Float -> TurtleCommand ()
setRotationSpeed = Lens' TurtleData Float -> Float -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Float
T.rotationSpeed
representation :: TurtleCommand Picture
representation :: TurtleCommand Picture
representation = Picture -> Lens' TurtleData Picture -> TurtleCommand Picture
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ Picture
blank Lens' TurtleData Picture
T.representation
setRepresentation :: Picture
-> TurtleCommand ()
setRepresentation :: Picture -> TurtleCommand ()
setRepresentation = Lens' TurtleData Picture -> Picture -> TurtleCommand ()
forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData Picture
T.representation
clear :: WorldCommand ()
clear :: WorldCommand ()
clear = Coroutine (Request TSC Float) TurtleState () -> WorldCommand ()
forall a. SequenceCommand a -> WorldCommand a
WorldCommand (Coroutine (Request TSC Float) TurtleState () -> WorldCommand ())
-> Coroutine (Request TSC Float) TurtleState () -> WorldCommand ()
forall a b. (a -> b) -> a -> b
$ TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ do
([Picture] -> Identity [Picture]) -> TSC -> Identity TSC
Lens' TSC [Picture]
pics (([Picture] -> Identity [Picture]) -> TSC -> Identity TSC)
-> [Picture] -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= [Picture]
forall a. Monoid a => a
mempty
([Picture] -> Identity [Picture]) -> TSC -> Identity TSC
Lens' TSC [Picture]
finalPics (([Picture] -> Identity [Picture]) -> TSC -> Identity TSC)
-> [Picture] -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= [Picture]
forall a. Monoid a => a
mempty
sleep :: Float
-> WorldCommand ()
sleep :: Float -> WorldCommand ()
sleep = Coroutine (Request TSC Float) TurtleState () -> WorldCommand ()
forall a. SequenceCommand a -> WorldCommand a
WorldCommand (Coroutine (Request TSC Float) TurtleState () -> WorldCommand ())
-> (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Float
-> WorldCommand ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coroutine (Request TSC Float) TurtleState Bool
-> Coroutine (Request TSC Float) TurtleState ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Coroutine (Request TSC Float) TurtleState Bool
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState Bool)
-> Float
-> Coroutine (Request TSC Float) TurtleState ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Coroutine (Request TSC Float) TurtleState Bool
decrementSimTime (Float -> Coroutine (Request TSC Float) TurtleState Bool)
-> (Float -> Float)
-> Float
-> Coroutine (Request TSC Float) TurtleState Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float -> Float
forall a. Ord a => a -> a -> a
max Float
0
wait :: Float
-> TurtleCommand ()
wait :: Float -> TurtleCommand ()
wait Float
f = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
_ -> Coroutine (Request TSC Float) TurtleState Bool
-> Coroutine (Request TSC Float) TurtleState ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Coroutine (Request TSC Float) TurtleState Bool
-> Coroutine (Request TSC Float) TurtleState ())
-> (Float -> Coroutine (Request TSC Float) TurtleState Bool)
-> Float
-> Coroutine (Request TSC Float) TurtleState ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Coroutine (Request TSC Float) TurtleState Bool
decrementSimTime (Float -> Coroutine (Request TSC Float) TurtleState ())
-> Float -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Float
forall a. Ord a => a -> a -> a
max Float
0 Float
f
repeatFor :: Int
-> TurtleCommand a
-> TurtleCommand ()
repeatFor :: forall a. Int -> TurtleCommand a -> TurtleCommand ()
repeatFor = Int -> TurtleCommand a -> TurtleCommand ()
forall (m :: * -> *) a. Applicative m => Int -> m a -> m ()
replicateM_
branch :: TurtleCommand a -> TurtleCommand a
branch :: forall a. TurtleCommand a -> TurtleCommand a
branch (TurtleCommand Turtle -> WorldCommand a
p ) = (Turtle -> SequenceCommand a) -> TurtleCommand a
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> SequenceCommand a) -> TurtleCommand a)
-> (Turtle -> SequenceCommand a) -> TurtleCommand a
forall a b. (a -> b) -> a -> b
$ \ Turtle
turtle -> do
!TurtleData
t <- Turtle -> SequenceCommand TurtleData
tData_ Turtle
turtle
a
output <- WorldCommand a -> SequenceCommand a
forall a. WorldCommand a -> SequenceCommand a
seqW (WorldCommand a -> SequenceCommand a)
-> WorldCommand a -> SequenceCommand a
forall a b. (a -> b) -> a -> b
$ Turtle -> WorldCommand a
p Turtle
turtle
TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
turtle ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> TurtleData -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= TurtleData
t
a -> SequenceCommand a
forall (m :: * -> *) a. Monad m => a -> m a
return a
output
north :: Float
north :: Float
north = Float
90
east :: Float
east :: Float
east = Float
0
west :: Float
west :: Float
west = Float
180
south :: Float
south :: Float
south = Float
270
turtLens_ :: Applicative f
=> Turtle
-> (T.TurtleData -> f T.TurtleData)
-> TSC
-> f TSC
turtLens_ :: forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
t = (Map Turtle TurtleData -> f (Map Turtle TurtleData))
-> TSC -> f TSC
Lens' TSC (Map Turtle TurtleData)
turtles ((Map Turtle TurtleData -> f (Map Turtle TurtleData))
-> TSC -> f TSC)
-> ((TurtleData -> f TurtleData)
-> Map Turtle TurtleData -> f (Map Turtle TurtleData))
-> (TurtleData -> f TurtleData)
-> TSC
-> f TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (Map Turtle TurtleData)
-> Traversal'
(Map Turtle TurtleData) (IxValue (Map Turtle TurtleData))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index (Map Turtle TurtleData)
Turtle
t
{-# INLINE turtLens_ #-}
getter_ :: a -> Lens' T.TurtleData a -> TurtleCommand a
getter_ :: forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ a
def Lens' TurtleData a
l = (Turtle -> SequenceCommand a) -> TurtleCommand a
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> SequenceCommand a) -> TurtleCommand a)
-> (Turtle -> SequenceCommand a) -> TurtleCommand a
forall a b. (a -> b) -> a -> b
$ \ Turtle
t -> TurtleState a -> SequenceCommand a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState a -> SequenceCommand a)
-> TurtleState a -> SequenceCommand a
forall a b. (a -> b) -> a -> b
$ a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
def (Maybe a -> a) -> TurtleState (Maybe a) -> TurtleState a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Getting (First a) TSC a -> TurtleState (Maybe a)
forall s (m :: * -> *) a.
MonadState s m =>
Getting (First a) s a -> m (Maybe a)
preuse (Turtle
-> (TurtleData -> Const (First a) TurtleData)
-> TSC
-> Const (First a) TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
t ((TurtleData -> Const (First a) TurtleData)
-> TSC -> Const (First a) TSC)
-> ((a -> Const (First a) a)
-> TurtleData -> Const (First a) TurtleData)
-> Getting (First a) TSC a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Const (First a) a)
-> TurtleData -> Const (First a) TurtleData
Lens' TurtleData a
l)
{-# INLINE getter_ #-}
tData_ :: Turtle -> SequenceCommand T.TurtleData
tData_ :: Turtle -> SequenceCommand TurtleData
tData_ Turtle
t = WorldCommand TurtleData -> SequenceCommand TurtleData
forall a. WorldCommand a -> SequenceCommand a
seqW (WorldCommand TurtleData -> SequenceCommand TurtleData)
-> WorldCommand TurtleData -> SequenceCommand TurtleData
forall a b. (a -> b) -> a -> b
$ TurtleCommand TurtleData -> Turtle -> WorldCommand TurtleData
forall a. TurtleCommand a -> Turtle -> WorldCommand a
seqT (TurtleData
-> Lens' TurtleData TurtleData -> TurtleCommand TurtleData
forall a. a -> Lens' TurtleData a -> TurtleCommand a
getter_ TurtleData
T.defaultTurtle forall a. a -> a
Lens' TurtleData TurtleData
id) Turtle
t
{-# INLINE tData_ #-}
setter_ :: Lens' T.TurtleData b -> b -> TurtleCommand ()
setter_ :: forall b. Lens' TurtleData b -> b -> TurtleCommand ()
setter_ Lens' TurtleData b
l b
val = (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a. (Turtle -> SequenceCommand a) -> TurtleCommand a
seqToT ((Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ())
-> (Turtle -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleCommand ()
forall a b. (a -> b) -> a -> b
$ \ Turtle
t -> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (TurtleState () -> Coroutine (Request TSC Float) TurtleState ())
-> TurtleState () -> Coroutine (Request TSC Float) TurtleState ()
forall a b. (a -> b) -> a -> b
$ Turtle
-> (TurtleData -> Identity TurtleData) -> TSC -> Identity TSC
forall (f :: * -> *).
Applicative f =>
Turtle -> (TurtleData -> f TurtleData) -> TSC -> f TSC
turtLens_ Turtle
t ((TurtleData -> Identity TurtleData) -> TSC -> Identity TSC)
-> ((b -> Identity b) -> TurtleData -> Identity TurtleData)
-> (b -> Identity b)
-> TSC
-> Identity TSC
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> Identity b) -> TurtleData -> Identity TurtleData
Lens' TurtleData b
l ((b -> Identity b) -> TSC -> Identity TSC) -> b -> TurtleState ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= b
val
{-# INLINE setter_ #-}