Skip to content

Commit 741e3ca

Browse files
add Transformable instance for RTree, QDiagram
1 parent 0de449f commit 741e3ca

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/Diagrams/Core/Types.hs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ import Diagrams.Core.V
149149
import Linear.Affine
150150
import Linear.Metric
151151
import Linear.Vector
152+
import Linear.V1
152153

153154
-- XXX TODO: add lots of actual diagrams to illustrate the
154155
-- documentation! Haddock supports \<\<inline image urls\>\>.
@@ -429,7 +430,7 @@ instance (Metric v, OrderedField n, Semigroup m)
429430

430431
---- Juxtaposable
431432

432-
instance (Metric v, OrderedField n, Monoid' m)
433+
instance (Metric v, OrderedField n, Monoid' m, T.Traversable v)
433434
=> Juxtaposable (QDiagram b v n m) where
434435
juxtapose = juxtaposeDefault
435436

@@ -463,17 +464,25 @@ instance (Metric v, OrderedField n, Semigroup m)
463464

464465
-- | Every diagram has an intrinsic \"local origin\" which is the
465466
-- basis for all combining operations.
466-
instance (Metric v, OrderedField n, Semigroup m)
467+
instance (Metric v, T.Traversable v, OrderedField n, Monoid' m)
467468
=> HasOrigin (QDiagram b v n m) where
468469
moveOriginTo = translate . (origin .-.)
469470

470471
---- Transformable
471472

472473
-- | Diagrams can be transformed by transforming each of their
473474
-- components appropriately.
474-
instance (Metric v, OrderedField n, Semigroup m)
475+
instance (Metric v, T.Traversable v, OrderedField n, Monoid' m)
475476
=> Transformable (QDiagram b v n m) where
476-
transform = undefined -- over _Wrapped' . transform
477+
transform t (QD c) = over trace (transform t) qd
478+
where
479+
qd = over envelope (transform t) qd'
480+
qd' = c >>>= \(rTree, summary) -> QD . return $ (transform t rTree, summary)
481+
482+
-- XXX I'm still not sure this is what we want? What to do with queries
483+
-- We transform the 'RTree' using it's instance and the components of
484+
-- 'Summary' separately.
485+
477486

478487
--- XXX not sure why (over _Wrapped' . transform) doesn't type check.
479488
--
@@ -688,6 +697,15 @@ data RNode b v n a = RStyle (Style v n) -- ^ A style node.
688697
| RPrim (Prim b v n) -- ^ A primitive.
689698
| REmpty
690699

700+
type instance V (RNode b v n a) = v
701+
type instance N (RNode b v n a) = n
702+
703+
instance (Additive v, T.Traversable v, Floating n) => Transformable (RNode b v n a) where
704+
transform t (RStyle (Style v)) = RStyle $ transform t (Style v)
705+
transform _ (RAnnot a) = RAnnot a
706+
transform t (RPrim (Prim v)) = RPrim $ transform t (Prim v)
707+
transform _ REmpty = REmpty
708+
691709
-- | An 'RTree' is a compiled and optimized representation of a
692710
-- 'QDiagram', which can be used by backends. They have the
693711
-- following invariant which backends may rely upon:
@@ -704,6 +722,9 @@ instance Rewrapped (RTree b v n a) (RTree b' v' n' a')
704722
type instance V (RTree b v n a) = v
705723
type instance N (RTree b v n a) = n
706724

725+
instance (Additive v, T.Traversable v, Floating n) => Transformable (RTree b v n a) where
726+
transform t = over _Wrapped' (fmap $ transform t)
727+
707728
instance Semigroup (RTree b v n a) where
708729
RTree t1 <> RTree t2 = RTree (Node REmpty[t1,t2])
709730
sconcat ts = RTree (Node REmpty . map (op RTree) . NEL.toList $ ts)

0 commit comments

Comments
 (0)