{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Diagrams.TwoD.Path.Turtle.Internal
(
TurtleState(..), TurtlePath(..), PenStyle(..)
, forward, backward, left, right
, setPenColor, setPenColour, setPenWidth
, startTurtle, setHeading, towards
, setPenPos
, penUp, penDown, penHop, closeCurrent
, getTurtleDiagram
, getTurtlePath
) where
import Diagrams.Prelude
data PenStyle n = PenStyle
{ forall n. PenStyle n -> Measure n
penWidth :: Measure n
, forall n. PenStyle n -> Colour Double
penColor :: Colour Double
}
data TurtlePath n = TurtlePath
{ forall n. TurtlePath n -> PenStyle n
penStyle :: PenStyle n
, forall n. TurtlePath n -> Located (Trail V2 n)
turtleTrail :: Located (Trail V2 n)
}
data TurtleState n = TurtleState
{
forall n. TurtleState n -> Bool
isPenDown :: Bool
, forall n. TurtleState n -> P2 n
penPos :: P2 n
, forall n. TurtleState n -> Angle n
heading :: Angle n
, forall n. TurtleState n -> Located (Trail' Line V2 n)
currTrail :: Located (Trail' Line V2 n)
, forall n. TurtleState n -> PenStyle n
currPenStyle :: PenStyle n
, forall n. TurtleState n -> [TurtlePath n]
paths :: [TurtlePath n]
}
defaultPenStyle :: (Floating n, Ord n) => PenStyle n
defaultPenStyle :: forall n. (Floating n, Ord n) => PenStyle n
defaultPenStyle = Measure n -> Colour Double -> PenStyle n
forall n. Measure n -> Colour Double -> PenStyle n
PenStyle (n -> Measure n
forall n. Num n => n -> Measure n
normalized n
0.004 Measure n -> Measure n -> Measure n
forall n. Ord n => Measure n -> Measure n -> Measure n
`atLeast` n -> Measure n
forall n. n -> Measure n
output n
0.5) Colour Double
forall a. Num a => Colour a
black
startTurtle :: (Floating n, Ord n) => TurtleState n
startTurtle :: forall n. (Floating n, Ord n) => TurtleState n
startTurtle = Bool
-> P2 n
-> Angle n
-> Located (Trail' Line V2 n)
-> PenStyle n
-> [TurtlePath n]
-> TurtleState n
forall n.
Bool
-> P2 n
-> Angle n
-> Located (Trail' Line V2 n)
-> PenStyle n
-> [TurtlePath n]
-> TurtleState n
TurtleState Bool
True P2 n
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin Angle n
forall a. Num a => Angle a
forall (f :: * -> *) a. (Additive f, Num a) => f a
zero (Trail' Line V2 n
forall a. Monoid a => a
mempty Trail' Line V2 n
-> Point (V (Trail' Line V2 n)) (N (Trail' Line V2 n))
-> Located (Trail' Line V2 n)
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V (Trail' Line V2 n)) (N (Trail' Line V2 n))
P2 n
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin) PenStyle n
forall n. (Floating n, Ord n) => PenStyle n
defaultPenStyle []
moveTurtle :: (Floating n, Ord n) => Segment Closed V2 n
-> TurtleState n
-> TurtleState n
moveTurtle :: forall n.
(Floating n, Ord n) =>
Segment Closed V2 n -> TurtleState n -> TurtleState n
moveTurtle Segment Closed V2 n
s t :: TurtleState n
t@(TurtleState Bool
pd P2 n
pos Angle n
h Located (Trail' Line V2 n)
tr PenStyle n
_ [TurtlePath n]
_) =
if Bool
pd
then TurtleState n
t { currTrail = newTrail
, penPos = newPenPos
}
else TurtleState n
t { penPos = newPenPos }
where
rotatedSeg :: Segment Closed V2 n
rotatedSeg = Angle n -> Segment Closed V2 n -> Segment Closed V2 n
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
Angle n -> t -> t
rotate Angle n
h Segment Closed V2 n
s
newTrail :: Located (Trail' Line V2 n)
newTrail = (Trail' Line V2 n -> Trail' Line V2 n)
-> Located (Trail' Line V2 n) -> Located (Trail' Line V2 n)
forall a b. SameSpace a b => (a -> b) -> Located a -> Located b
mapLoc (Trail' Line V2 n -> Trail' Line V2 n -> Trail' Line V2 n
forall a. Semigroup a => a -> a -> a
<> [Segment Closed (V (Trail' Line V2 n)) (N (Trail' Line V2 n))]
-> Trail' Line V2 n
forall t. TrailLike t => [Segment Closed (V t) (N t)] -> t
fromSegments [Segment Closed (V (Trail' Line V2 n)) (N (Trail' Line V2 n))
Segment Closed V2 n
rotatedSeg]) Located (Trail' Line V2 n)
tr
newPenPos :: P2 n
newPenPos = P2 n
pos P2 n -> Diff (Point V2) n -> P2 n
forall a. Num a => Point V2 a -> Diff (Point V2) a -> Point V2 a
forall (p :: * -> *) a. (Affine p, Num a) => p a -> Diff p a -> p a
.+^ Segment Closed V2 n -> V2 n
forall (v :: * -> *) n. Segment Closed v n -> v n
segOffset Segment Closed V2 n
rotatedSeg
forward :: (Floating n, Ord n) => n
-> TurtleState n
-> TurtleState n
forward :: forall n.
(Floating n, Ord n) =>
n -> TurtleState n -> TurtleState n
forward n
x = Segment Closed V2 n -> TurtleState n -> TurtleState n
forall n.
(Floating n, Ord n) =>
Segment Closed V2 n -> TurtleState n -> TurtleState n
moveTurtle (V2 n -> Segment Closed V2 n
forall (v :: * -> *) n. v n -> Segment Closed v n
straight (V2 n -> Segment Closed V2 n) -> V2 n -> Segment Closed V2 n
forall a b. (a -> b) -> a -> b
$ (n, n) -> V2 n
forall n. (n, n) -> V2 n
r2 (n
x,n
0))
backward :: (Floating n, Ord n) => n
-> TurtleState n
-> TurtleState n
backward :: forall n.
(Floating n, Ord n) =>
n -> TurtleState n -> TurtleState n
backward n
x = Segment Closed V2 n -> TurtleState n -> TurtleState n
forall n.
(Floating n, Ord n) =>
Segment Closed V2 n -> TurtleState n -> TurtleState n
moveTurtle (V2 n -> Segment Closed V2 n
forall (v :: * -> *) n. v n -> Segment Closed v n
straight (V2 n -> Segment Closed V2 n) -> V2 n -> Segment Closed V2 n
forall a b. (a -> b) -> a -> b
$ (n, n) -> V2 n
forall n. (n, n) -> V2 n
r2 (n -> n
forall a. Num a => a -> a
negate n
x, n
0))
turnTurtle :: (Angle n -> Angle n)
-> TurtleState n
-> TurtleState n
turnTurtle :: forall n. (Angle n -> Angle n) -> TurtleState n -> TurtleState n
turnTurtle Angle n -> Angle n
f t :: TurtleState n
t@(TurtleState Bool
_ P2 n
_ Angle n
h Located (Trail' Line V2 n)
_ PenStyle n
_ [TurtlePath n]
_) = TurtleState n
t { heading = f h }
left :: Floating n
=> n
-> TurtleState n
-> TurtleState n
left :: forall n. Floating n => n -> TurtleState n -> TurtleState n
left n
d = (Angle n -> Angle n) -> TurtleState n -> TurtleState n
forall n. (Angle n -> Angle n) -> TurtleState n -> TurtleState n
turnTurtle (Angle n -> Angle n -> Angle n
forall a. Num a => Angle a -> Angle a -> Angle a
forall (f :: * -> *) a. (Additive f, Num a) => f a -> f a -> f a
^+^ (n
d n -> AReview (Angle n) n -> Angle n
forall b a. b -> AReview a b -> a
@@ AReview (Angle n) n
forall n. Floating n => Iso' (Angle n) n
Iso' (Angle n) n
deg))
right :: Floating n
=> n
-> TurtleState n
-> TurtleState n
right :: forall n. Floating n => n -> TurtleState n -> TurtleState n
right n
d = (Angle n -> Angle n) -> TurtleState n -> TurtleState n
forall n. (Angle n -> Angle n) -> TurtleState n -> TurtleState n
turnTurtle (Angle n -> Angle n -> Angle n
forall a. Num a => Angle a -> Angle a -> Angle a
forall (f :: * -> *) a. (Additive f, Num a) => f a -> f a -> f a
^-^ (n
d n -> AReview (Angle n) n -> Angle n
forall b a. b -> AReview a b -> a
@@ AReview (Angle n) n
forall n. Floating n => Iso' (Angle n) n
Iso' (Angle n) n
deg))
setHeading :: Floating n
=> n
-> TurtleState n
-> TurtleState n
setHeading :: forall n. Floating n => n -> TurtleState n -> TurtleState n
setHeading n
d = (Angle n -> Angle n) -> TurtleState n -> TurtleState n
forall n. (Angle n -> Angle n) -> TurtleState n -> TurtleState n
turnTurtle (Angle n -> Angle n -> Angle n
forall a b. a -> b -> a
const (Angle n -> Angle n -> Angle n) -> Angle n -> Angle n -> Angle n
forall a b. (a -> b) -> a -> b
$ n
d n -> AReview (Angle n) n -> Angle n
forall b a. b -> AReview a b -> a
@@ AReview (Angle n) n
forall n. Floating n => Iso' (Angle n) n
Iso' (Angle n) n
deg)
towards :: RealFloat n =>
P2 n
-> TurtleState n
-> TurtleState n
towards :: forall n. RealFloat n => P2 n -> TurtleState n -> TurtleState n
towards P2 n
p = n -> TurtleState n -> TurtleState n
forall n. Floating n => n -> TurtleState n -> TurtleState n
setHeading (n -> TurtleState n -> TurtleState n)
-> (TurtleState n -> n) -> TurtleState n -> TurtleState n
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (n
360 n -> n -> n
forall a. Num a => a -> a -> a
*) (n -> n) -> (TurtleState n -> n) -> TurtleState n -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
forall a. Floating a => a
tau) (n -> n) -> (TurtleState n -> n) -> TurtleState n -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (n -> n -> n) -> (n, n) -> n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry n -> n -> n
forall a. RealFloat a => a -> a -> a
atan2 ((n, n) -> n) -> (TurtleState n -> (n, n)) -> TurtleState n -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. V2 n -> (n, n)
forall n. V2 n -> (n, n)
unr2 (V2 n -> (n, n))
-> (TurtleState n -> V2 n) -> TurtleState n -> (n, n)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (P2 n
p P2 n -> P2 n -> Diff (Point V2) n
forall a. Num a => Point V2 a -> Point V2 a -> Diff (Point V2) a
forall (p :: * -> *) a. (Affine p, Num a) => p a -> p a -> Diff p a
.-.) (P2 n -> V2 n) -> (TurtleState n -> P2 n) -> TurtleState n -> V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TurtleState n -> P2 n
forall n. TurtleState n -> P2 n
penPos
penUp :: (Ord n, Floating n) => TurtleState n
-> TurtleState n
penUp :: forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penUp TurtleState n
t
| TurtleState n -> Bool
forall n. TurtleState n -> Bool
isPenDown TurtleState n
t = TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# \TurtleState n
t' -> TurtleState n
t' { isPenDown = False }
| Bool
otherwise = TurtleState n
t
penDown :: (Ord n, Floating n) => TurtleState n
-> TurtleState n
penDown :: forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penDown TurtleState n
t
| TurtleState n -> Bool
forall n. TurtleState n -> Bool
isPenDown TurtleState n
t = TurtleState n
t
| Bool
otherwise = TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# \TurtleState n
t' -> TurtleState n
t' { isPenDown = True }
penHop :: (Ord n, Floating n) => TurtleState n
-> TurtleState n
penHop :: forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penHop TurtleState n
t = TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail
closeCurrent :: (Floating n, Ord n) => TurtleState n
-> TurtleState n
closeCurrent :: forall n. (Floating n, Ord n) => TurtleState n -> TurtleState n
closeCurrent TurtleState n
t
| TurtleState n -> Bool
forall n. TurtleState n -> Bool
isPenDown TurtleState n
t = TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
closeTTrail
| Bool
otherwise = TurtleState n
t
where startPos :: P2 n
startPos = Located (Trail' Line V2 n)
-> Point (V (Trail' Line V2 n)) (N (Trail' Line V2 n))
Located (Trail' Line V2 n) -> P2 n
forall a. Located a -> Point (V a) (N a)
loc (Located (Trail' Line V2 n) -> P2 n)
-> (TurtleState n -> Located (Trail' Line V2 n))
-> TurtleState n
-> P2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TurtleState n -> Located (Trail' Line V2 n)
forall n. TurtleState n -> Located (Trail' Line V2 n)
currTrail (TurtleState n -> P2 n) -> TurtleState n -> P2 n
forall a b. (a -> b) -> a -> b
$ TurtleState n
t
closeTTrail :: TurtleState n -> TurtleState n
closeTTrail TurtleState n
t' = TurtleState n
t' { penPos = startPos
, currTrail = mempty `at` startPos
, paths = addTrailToPath t'
(mapLoc (wrapTrail . closeLine) $ currTrail t)
}
setPenPos :: (Ord n, Floating n) => P2 n
-> TurtleState n
-> TurtleState n
setPenPos :: forall n.
(Ord n, Floating n) =>
P2 n -> TurtleState n -> TurtleState n
setPenPos P2 n
newPos TurtleState n
t = TurtleState n
t {penPos = newPos } TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail
setPenWidth :: (Ord n, Floating n) => Measure n
-> TurtleState n
-> TurtleState n
setPenWidth :: forall n.
(Ord n, Floating n) =>
Measure n -> TurtleState n -> TurtleState n
setPenWidth Measure n
w = (PenStyle n -> PenStyle n) -> TurtleState n -> TurtleState n
forall n.
(Floating n, Ord n) =>
(PenStyle n -> PenStyle n) -> TurtleState n -> TurtleState n
modifyCurrStyle (\PenStyle n
s -> PenStyle n
s { penWidth = w })
setPenColour :: (Ord n, Floating n) => Colour Double
-> TurtleState n
-> TurtleState n
setPenColour :: forall n.
(Ord n, Floating n) =>
Colour Double -> TurtleState n -> TurtleState n
setPenColour Colour Double
c = (PenStyle n -> PenStyle n) -> TurtleState n -> TurtleState n
forall n.
(Floating n, Ord n) =>
(PenStyle n -> PenStyle n) -> TurtleState n -> TurtleState n
modifyCurrStyle (\PenStyle n
s -> PenStyle n
s { penColor = c })
setPenColor :: (Ord n, Floating n) => Colour Double
-> TurtleState n
-> TurtleState n
setPenColor :: forall n.
(Ord n, Floating n) =>
Colour Double -> TurtleState n -> TurtleState n
setPenColor = Colour Double -> TurtleState n -> TurtleState n
forall n.
(Ord n, Floating n) =>
Colour Double -> TurtleState n -> TurtleState n
setPenColour
getTurtleDiagram :: (Renderable (Path V2 n) b, TypeableFloat n)
=> TurtleState n
-> QDiagram b V2 n Any
getTurtleDiagram :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
TurtleState n -> QDiagram b V2 n Any
getTurtleDiagram TurtleState n
t =
[QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a. Monoid a => [a] -> a
mconcat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> (TurtleState n -> [QDiagram b V2 n Any])
-> TurtleState n
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(TurtlePath n -> QDiagram b V2 n Any)
-> [TurtlePath n] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map TurtlePath n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
TurtlePath n -> QDiagram b V2 n Any
turtlePathToStroke ([TurtlePath n] -> [QDiagram b V2 n Any])
-> (TurtleState n -> [TurtlePath n])
-> TurtleState n
-> [QDiagram b V2 n Any]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
TurtleState n -> [TurtlePath n]
forall n. TurtleState n -> [TurtlePath n]
paths (TurtleState n -> QDiagram b V2 n Any)
-> TurtleState n -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penUp
getTurtlePath :: (Floating n, Ord n) => TurtleState n -> Path V2 n
getTurtlePath :: forall n. (Floating n, Ord n) => TurtleState n -> Path V2 n
getTurtlePath = [Path V2 n] -> Path V2 n
forall a. Monoid a => [a] -> a
mconcat ([Path V2 n] -> Path V2 n)
-> (TurtleState n -> [Path V2 n]) -> TurtleState n -> Path V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TurtlePath n -> Path V2 n) -> [TurtlePath n] -> [Path V2 n]
forall a b. (a -> b) -> [a] -> [b]
map TurtlePath n -> Path V2 n
forall t n. (V t ~ V2, N t ~ n, TrailLike t) => TurtlePath n -> t
turtlePathToTrailLike ([TurtlePath n] -> [Path V2 n])
-> (TurtleState n -> [TurtlePath n])
-> TurtleState n
-> [Path V2 n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TurtleState n -> [TurtlePath n]
forall n. TurtleState n -> [TurtlePath n]
paths (TurtleState n -> [TurtlePath n])
-> (TurtleState n -> TurtleState n)
-> TurtleState n
-> [TurtlePath n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penUp
makeTurtlePath :: TurtleState n
-> Located (Trail V2 n)
-> TurtlePath n
makeTurtlePath :: forall n. TurtleState n -> Located (Trail V2 n) -> TurtlePath n
makeTurtlePath TurtleState n
t Located (Trail V2 n)
tr = PenStyle n -> Located (Trail V2 n) -> TurtlePath n
forall n. PenStyle n -> Located (Trail V2 n) -> TurtlePath n
TurtlePath (TurtleState n -> PenStyle n
forall n. TurtleState n -> PenStyle n
currPenStyle TurtleState n
t) Located (Trail V2 n)
tr
addTrailToPath :: (Ord n, Floating n) => TurtleState n
-> Located (Trail V2 n)
-> [TurtlePath n]
addTrailToPath :: forall n.
(Ord n, Floating n) =>
TurtleState n -> Located (Trail V2 n) -> [TurtlePath n]
addTrailToPath TurtleState n
t Located (Trail V2 n)
tr
| Trail V2 n -> Bool
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail v n -> Bool
isTrailEmpty (Located (Trail V2 n) -> Trail V2 n
forall a. Located a -> a
unLoc Located (Trail V2 n)
tr) = TurtleState n -> [TurtlePath n]
forall n. TurtleState n -> [TurtlePath n]
paths TurtleState n
t
| Bool
otherwise = TurtleState n -> Located (Trail V2 n) -> TurtlePath n
forall n. TurtleState n -> Located (Trail V2 n) -> TurtlePath n
makeTurtlePath TurtleState n
t Located (Trail V2 n)
tr TurtlePath n -> [TurtlePath n] -> [TurtlePath n]
forall a. a -> [a] -> [a]
: TurtleState n -> [TurtlePath n]
forall n. TurtleState n -> [TurtlePath n]
paths TurtleState n
t
makeNewTrail :: (Ord n, Floating n) => TurtleState n
-> TurtleState n
makeNewTrail :: forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail TurtleState n
t = TurtleState n
t { currTrail = mempty `at` penPos t
, paths = addTrailToPath t (mapLoc wrapTrail (currTrail t))
}
modifyCurrStyle :: (Floating n, Ord n) =>
(PenStyle n -> PenStyle n)
-> TurtleState n
-> TurtleState n
modifyCurrStyle :: forall n.
(Floating n, Ord n) =>
(PenStyle n -> PenStyle n) -> TurtleState n -> TurtleState n
modifyCurrStyle PenStyle n -> PenStyle n
f TurtleState n
t = TurtleState n
t TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# TurtleState n -> TurtleState n
forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
makeNewTrail TurtleState n -> (TurtleState n -> TurtleState n) -> TurtleState n
forall a b. a -> (a -> b) -> b
# \TurtleState n
t' -> TurtleState n
t' { currPenStyle = (f . currPenStyle) t' }
turtlePathToTrailLike :: (V t ~ V2, N t ~ n, TrailLike t) => TurtlePath n -> t
turtlePathToTrailLike :: forall t n. (V t ~ V2, N t ~ n, TrailLike t) => TurtlePath n -> t
turtlePathToTrailLike (TurtlePath PenStyle n
_ Located (Trail V2 n)
t) = Located (Trail (V t) (N t)) -> t
forall t. TrailLike t => Located (Trail (V t) (N t)) -> t
trailLike Located (Trail (V t) (N t))
Located (Trail V2 n)
t
turtlePathToStroke :: (Renderable (Path V2 n) b, TypeableFloat n) =>
TurtlePath n
-> QDiagram b V2 n Any
turtlePathToStroke :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
TurtlePath n -> QDiagram b V2 n Any
turtlePathToStroke t :: TurtlePath n
t@(TurtlePath (PenStyle Measure n
lineWidth_ Colour Double
lineColor_) Located (Trail V2 n)
_) = QDiagram b V2 n Any
d
where d :: QDiagram b V2 n Any
d = Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
lineColor_ (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> (Located (Trail V2 n) -> QDiagram b V2 n Any)
-> Located (Trail V2 n)
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Measure n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure n
lineWidth_ (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> (Located (Trail V2 n) -> QDiagram b V2 n Any)
-> Located (Trail V2 n)
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
Located (Trail V2 n) -> QDiagram b V2 n Any
forall n b.
(TypeableFloat n, Renderable (Path V2 n) b) =>
Located (Trail V2 n) -> QDiagram b V2 n Any
strokeLocTrail (Located (Trail V2 n) -> QDiagram b V2 n Any)
-> Located (Trail V2 n) -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ TurtlePath n -> Located (Trail V2 n)
forall t n. (V t ~ V2, N t ~ n, TrailLike t) => TurtlePath n -> t
turtlePathToTrailLike TurtlePath n
t