{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Diagrams.TrailLike
(
TrailLike(..)
, fromSegments, fromLocSegments, fromOffsets, fromLocOffsets, fromVertices
, (~~), explodeTrail
) where
import Control.Lens (view, _Unwrapped')
import Diagrams.Core
import Diagrams.Located
import Diagrams.Segment
import Diagrams.Trail
import Linear.Affine
import Linear.Metric
import Linear.Vector
class (Metric (V t), OrderedField (N t)) => TrailLike t where
trailLike
:: Located (Trail (V t) (N t))
-> t
instance (Metric v, OrderedField n) => TrailLike [Point v n] where
trailLike :: Located (Trail (V [Point v n]) (N [Point v n])) -> [Point v n]
trailLike = Located (Trail v n) -> [Point v n]
Located (Trail (V [Point v n]) (N [Point v n])) -> [Point v n]
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Located (Trail v n) -> [Point v n]
trailPoints
instance (Metric v, OrderedField n) => TrailLike (Trail' Line v n) where
trailLike :: Located (Trail (V (Trail' Line v n)) (N (Trail' Line v n)))
-> Trail' Line v n
trailLike = (Trail' Line v n -> Trail' Line v n)
-> (Trail' Loop v n -> Trail' Line v n)
-> Trail v n
-> Trail' Line v n
forall (v :: * -> *) n r.
(Trail' Line v n -> r) -> (Trail' Loop v n -> r) -> Trail v n -> r
withTrail Trail' Line v n -> Trail' Line v n
forall a. a -> a
id Trail' Loop v n -> Trail' Line v n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail' Loop v n -> Trail' Line v n
cutLoop (Trail v n -> Trail' Line v n)
-> (Located (Trail v n) -> Trail v n)
-> Located (Trail v n)
-> Trail' Line v n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (Trail v n) -> Trail v n
forall a. Located a -> a
unLoc
instance (Metric v, OrderedField n) => TrailLike (Trail' Loop v n) where
trailLike :: Located (Trail (V (Trail' Loop v n)) (N (Trail' Loop v n)))
-> Trail' Loop v n
trailLike = (Trail' Line v n -> Trail' Loop v n)
-> (Trail' Loop v n -> Trail' Loop v n)
-> Trail v n
-> Trail' Loop v n
forall (v :: * -> *) n r.
(Trail' Line v n -> r) -> (Trail' Loop v n -> r) -> Trail v n -> r
withTrail Trail' Line v n -> Trail' Loop v n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail' Line v n -> Trail' Loop v n
glueLine Trail' Loop v n -> Trail' Loop v n
forall a. a -> a
id (Trail v n -> Trail' Loop v n)
-> (Located (Trail v n) -> Trail v n)
-> Located (Trail v n)
-> Trail' Loop v n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (Trail v n) -> Trail v n
forall a. Located a -> a
unLoc
instance (Metric v, OrderedField n) => TrailLike (Trail v n) where
trailLike :: Located (Trail (V (Trail v n)) (N (Trail v n))) -> Trail v n
trailLike = Located (Trail v n) -> Trail v n
Located (Trail (V (Trail v n)) (N (Trail v n))) -> Trail v n
forall a. Located a -> a
unLoc
instance TrailLike t => TrailLike (TransInv t) where
trailLike :: Located (Trail (V (TransInv t)) (N (TransInv t))) -> TransInv t
trailLike = Getting (TransInv t) t (TransInv t) -> t -> TransInv t
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting (TransInv t) t (TransInv t)
(TransInv t -> Const (TransInv t) (TransInv t))
-> Unwrapped (TransInv t)
-> Const (TransInv t) (Unwrapped (TransInv t))
forall s. Wrapped s => Iso' (Unwrapped s) s
Iso' (Unwrapped (TransInv t)) (TransInv t)
_Unwrapped' (t -> TransInv t)
-> (Located (Trail (V t) (N t)) -> t)
-> Located (Trail (V t) (N t))
-> TransInv t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (Trail (V t) (N t)) -> t
forall t. TrailLike t => Located (Trail (V t) (N t)) -> t
trailLike
instance TrailLike t => TrailLike (Located t) where
trailLike :: Located (Trail (V (Located t)) (N (Located t))) -> Located t
trailLike Located (Trail (V (Located t)) (N (Located t)))
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 (V (Located t)) (N (Located t)))
t t -> Point (V t) (N t) -> Located t
forall a. a -> Point (V a) (N a) -> Located a
`at` Located (Trail (V t) (N t))
-> Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
forall a. Located a -> Point (V a) (N a)
loc Located (Trail (V t) (N t))
Located (Trail (V (Located t)) (N (Located t)))
t
fromSegments :: TrailLike t => [Segment Closed (V t) (N t)] -> t
fromSegments :: forall t. TrailLike t => [Segment Closed (V t) (N t)] -> t
fromSegments = Located [Segment Closed (V t) (N t)] -> t
forall t. TrailLike t => Located [Segment Closed (V t) (N t)] -> t
fromLocSegments (Located [Segment Closed (V t) (N t)] -> t)
-> ([Segment Closed (V t) (N t)]
-> Located [Segment Closed (V t) (N t)])
-> [Segment Closed (V t) (N t)]
-> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Segment Closed (V t) (N t)]
-> Point
(V [Segment Closed (V t) (N t)]) (N [Segment Closed (V t) (N t)])
-> Located [Segment Closed (V t) (N t)]
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V t) (N t)
Point
(V [Segment Closed (V t) (N t)]) (N [Segment Closed (V t) (N t)])
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin)
fromLocSegments :: TrailLike t => Located [Segment Closed (V t) (N t)] -> t
fromLocSegments :: forall t. TrailLike t => Located [Segment Closed (V t) (N t)] -> t
fromLocSegments = 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)) -> t)
-> (Located [Segment Closed (V t) (N t)]
-> Located (Trail (V t) (N t)))
-> Located [Segment Closed (V t) (N t)]
-> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Segment Closed (V t) (N t)] -> Trail (V t) (N t))
-> Located [Segment Closed (V t) (N t)]
-> Located (Trail (V t) (N t))
forall a b. SameSpace a b => (a -> b) -> Located a -> Located b
mapLoc [Segment Closed (V t) (N t)] -> Trail (V t) (N t)
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
[Segment Closed v n] -> Trail v n
trailFromSegments
fromOffsets :: TrailLike t => [Vn t] -> t
fromOffsets :: forall t. TrailLike t => [Vn t] -> t
fromOffsets = 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)) -> t)
-> ([V t (N t)] -> Located (Trail (V t) (N t))) -> [V t (N t)] -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Trail (V t) (N t)
-> Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
-> Located (Trail (V t) (N t))
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V t) (N t)
Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin) (Trail (V t) (N t) -> Located (Trail (V t) (N t)))
-> ([V t (N t)] -> Trail (V t) (N t))
-> [V t (N t)]
-> Located (Trail (V t) (N t))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [V t (N t)] -> Trail (V t) (N t)
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
[v n] -> Trail v n
trailFromOffsets
fromLocOffsets :: (V t ~ v, N t ~ n, V (v n) ~ v, N (v n) ~ n, TrailLike t) => Located [v n] -> t
fromLocOffsets :: forall t (v :: * -> *) n.
(V t ~ v, N t ~ n, V (v n) ~ v, N (v n) ~ n, TrailLike t) =>
Located [v n] -> t
fromLocOffsets = Located (Trail v n) -> t
Located (Trail (V t) (N t)) -> t
forall t. TrailLike t => Located (Trail (V t) (N t)) -> t
trailLike (Located (Trail v n) -> t)
-> (Located [v n] -> Located (Trail v n)) -> Located [v n] -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([v n] -> Trail v n) -> Located [v n] -> Located (Trail v n)
forall a b. SameSpace a b => (a -> b) -> Located a -> Located b
mapLoc [v n] -> Trail v n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
[v n] -> Trail v n
trailFromOffsets
fromVertices :: TrailLike t => [Point (V t) (N t)] -> t
fromVertices :: forall t. TrailLike t => [Point (V t) (N t)] -> t
fromVertices [] = Located (Trail (V t) (N t)) -> t
forall t. TrailLike t => Located (Trail (V t) (N t)) -> t
trailLike (Trail (V t) (N t)
forall (v :: * -> *) n. (Metric v, OrderedField n) => Trail v n
emptyTrail Trail (V t) (N t)
-> Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
-> Located (Trail (V t) (N t))
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V t) (N t)
Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin)
fromVertices ps :: [Point (V t) (N t)]
ps@(Point (V t) (N t)
p:[Point (V t) (N t)]
_) = Located (Trail (V t) (N t)) -> t
forall t. TrailLike t => Located (Trail (V t) (N t)) -> t
trailLike ([Segment Closed (V t) (N t)] -> Trail (V t) (N t)
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
[Segment Closed v n] -> Trail v n
trailFromSegments ([Point (V t) (N t)] -> [Segment Closed (V t) (N t)]
forall (v :: * -> *) n.
(Additive v, Num n) =>
[Point v n] -> [Segment Closed v n]
segmentsFromVertices [Point (V t) (N t)]
ps) Trail (V t) (N t)
-> Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
-> Located (Trail (V t) (N t))
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V t) (N t)
Point (V (Trail (V t) (N t))) (N (Trail (V t) (N t)))
p)
segmentsFromVertices :: (Additive v, Num n) => [Point v n] -> [Segment Closed v n]
segmentsFromVertices :: forall (v :: * -> *) n.
(Additive v, Num n) =>
[Point v n] -> [Segment Closed v n]
segmentsFromVertices [] = []
segmentsFromVertices vvs :: [Point v n]
vvs@(Point v n
_:[Point v n]
vs) = (v n -> Segment Closed v n) -> [v n] -> [Segment Closed v n]
forall a b. (a -> b) -> [a] -> [b]
map v n -> Segment Closed v n
forall (v :: * -> *) n. v n -> Segment Closed v n
straight ((Point v n -> Point v n -> v n)
-> [Point v n] -> [Point v n] -> [v n]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ((Point v n -> Point v n -> v n) -> Point v n -> Point v n -> v n
forall a b c. (a -> b -> c) -> b -> a -> c
flip Point v n -> Point v n -> v n
Point v n -> Point v n -> Diff (Point v) n
forall a. Num a => Point v a -> Point v a -> Diff (Point v) a
forall (p :: * -> *) a. (Affine p, Num a) => p a -> p a -> Diff p a
(.-.)) [Point v n]
vvs [Point v n]
vs)
(~~) :: (V t ~ v, N t ~ n, TrailLike t) => Point v n -> Point v n -> t
Point v n
p1 ~~ :: forall t (v :: * -> *) n.
(V t ~ v, N t ~ n, TrailLike t) =>
Point v n -> Point v n -> t
~~ Point v n
p2 = [Point (V t) (N t)] -> t
forall t. TrailLike t => [Point (V t) (N t)] -> t
fromVertices [Point v n
Point (V t) (N t)
p1, Point v n
Point (V t) (N t)
p2]
explodeTrail :: (V t ~ v, N t ~ n, TrailLike t) => Located (Trail v n) -> [t]
explodeTrail :: forall t (v :: * -> *) n.
(V t ~ v, N t ~ n, TrailLike t) =>
Located (Trail v n) -> [t]
explodeTrail = (FixedSegment v n -> t) -> [FixedSegment v n] -> [t]
forall a b. (a -> b) -> [a] -> [b]
map (Located (Segment Closed v n) -> t
Located (Segment Closed (V t) (N t)) -> t
mkTrail (Located (Segment Closed v n) -> t)
-> (FixedSegment v n -> Located (Segment Closed v n))
-> FixedSegment v n
-> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FixedSegment v n -> Located (Segment Closed v n)
forall n (v :: * -> *).
(Num n, Additive v) =>
FixedSegment v n -> Located (Segment Closed v n)
fromFixedSeg) ([FixedSegment v n] -> [t])
-> (Located (Trail v n) -> [FixedSegment v n])
-> Located (Trail v n)
-> [t]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Located (Trail v n) -> [FixedSegment v n]
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Located (Trail v n) -> [FixedSegment v n]
fixTrail
where
mkTrail :: Located (Segment Closed (V t) (N t)) -> t
mkTrail = 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)) -> t)
-> (Located (Segment Closed (V t) (N t))
-> Located (Trail (V t) (N t)))
-> Located (Segment Closed (V t) (N t))
-> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Segment Closed (V t) (N t) -> Trail (V t) (N t))
-> Located (Segment Closed (V t) (N t))
-> Located (Trail (V t) (N t))
forall a b. SameSpace a b => (a -> b) -> Located a -> Located b
mapLoc ([Segment Closed (V t) (N t)] -> Trail (V t) (N t)
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
[Segment Closed v n] -> Trail v n
trailFromSegments ([Segment Closed (V t) (N t)] -> Trail (V t) (N t))
-> (Segment Closed (V t) (N t) -> [Segment Closed (V t) (N t)])
-> Segment Closed (V t) (N t)
-> Trail (V t) (N t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Segment Closed (V t) (N t)
-> [Segment Closed (V t) (N t)] -> [Segment Closed (V t) (N t)]
forall a. a -> [a] -> [a]
:[]))