p :: forall s a f r. (Applicative f, Typeable a, Data s) => (a -> f a) -> f (s -> r) -> s -> f r
step f w s = w <*> case mightBe :: Maybe (Is s a) of
  Just Data.Data.Lens.Refl -> f s
  Nothing   -> tinplate f s
{-#
step :: forall s a f r. (Applicative f, Typeable a, Data s) => (a -> f a) -> f (s -> r) -> s -> f r
step f w s = w <*> case mightBe :: Maybe (Is s a) of
  Just Data.Data.Lens.Refl -> f s
  Nothing   -> tinplate f s

step f w s = w <*> case mightBe :: Maybe (Is s a) of
  Just Data.Data.Lens.Refl -> f s
  Nothing   -> tinplate f s
