UserPathAnything rootLookup (ProjP path f) = do
  (mod1, m) <- followUserPathAnything rootLookup path
  case mod1 of
   (F.ModSem flds) -> do
     let p (F.FUser f', _) | f == f' = True
         p _ = False
     case List.find p flds of
      Just (_, mod2) -> return (mod2, F.Proj m (F.FUser f))
      Nothing -> throwError ("unexpected failure in followUserPathAnything: field "
                             ++ show f ++ " not found in " ++ show path)
   _ -> throwError "unexpected failure in followUserPathAnything: not a module record"
follo
followUserPathAnything rootLookup (ProjP path f) = do
  (mod1, m) <- followUserPathAnything rootLookup path
  case mod1 of
   (F.ModSem flds) -> do
     let p (F.FUser f', _) | f == f' = True
         p _ = False
     case List.find p flds of
      Just (_, mod2) -> return (mod2, F.Proj m (F.FUser f))
      Nothing -> throwError ("unexpected failure in followUserPathAnything: field "
                             ++ show f ++ " not found in " ++ show path)
   _ -> throwError "unexpected failure in followUserPathAnything: not a module record"
followUserPathAnything rootLookup (ProjP path f) = do
  (mod1, m) <- followUserPathAnything rootLookup path
  case mod1 of
   (F.ModSem flds) -> do
     let p (F.FUser f', _) | f == f' = True
         p _ = False
     case List.find p flds of
      Just (_, mod2) -> return (mod2, F.Proj m (F.FUser f))
      Nothing -> throwError ("unexpected failure in followUserPathAnything: field "
                             ++ show f ++ " not found in " ++ show path)
   _ -> throwError "unexpected failure in followUserPathAnything: not a module record"