{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
module Glazier.React.Entity where
import Control.Lens
import Glazier.React.Subject
data Entity p s = Entity (Subject p) (Traversal' p s)
_subject :: Lens' (Entity p s) (Subject p)
_subject = lens (\(Entity p _) -> p) (\(Entity _ s) p -> Entity p s)
_self :: Lens (Entity p s) (Entity p s') (ReifiedTraversal' p s) (ReifiedTraversal' p s')
_self = lens (\(Entity _ s) -> Traversal s) (\(Entity p _) (Traversal t) -> Entity p t)
magnifiedEntity ::
( Magnify m n (Entity p a) (Entity p b)
, Contravariant (Magnified m r)
)
=> Traversal' b a -> m r -> n r
magnifiedEntity l = magnify (to go)
where
go (Entity sbj slf) = Entity sbj (slf.l)