2017-08-30 3 views
0

J'utilise Enum.reduceL'augmentation de jour avec quelques miliseonds utilisant Enum.reduce Elixir

Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc -> 

end) 

Je vais passer une méthode sur chaque réducteur comme

CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}, done_at) 

En done_at, les valeurs par défaut sont Ecto.DateTime.utc, Mais je veux augmenter cette date et l'heure sur chaque Enum.reduce.

J'ai essayé de déclarer le datetime au tout début de Enum.reduce comme done_at = Ecto.DateTime.utc, Mais je n'ai aucune idée de comment je vais le boucler en Enum.reduce, de sorte que je puisse augmenter quelques secondes en elle. Le but de ceci pour ne changer que le temps d'activité pour chaque itération. toute aide sera appréciée grâce

Mise à jour pour Dogbert

Enum.reduce(email_array, {[], [], []}, fn email, {shares, share_requests, changes} = _acc -> 
    with {:found_user, sharee} <- ensure_user(email) 
    do 
    case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do 
     {:ok, camera_share} -> 
     unless caller == sharee do 
      send_email_notification(caller, camera, sharee.email, camera_share.message) 
     end 
     Camera.invalidate_user(sharee) 
     Camera.invalidate_camera(camera) 
     CameraActivity.log_activity(caller, camera, "shared", %{with: sharee.email, ip: requester_ip}) 
     {[camera_share | shares], share_requests, changes} 
     {:error, changeset} -> 
     {shares, share_requests, [attach_email_to_message(changeset, email) | changes]} 
    end 
    else 
    {:not_found, email} -> 
     case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do 
     {:ok, camera_share_request} -> 
      send_email_notification(caller, camera, email, camera_share_request.message, camera_share_request.key) 
      CameraActivity.log_activity(caller, camera, "shared", %{with: email, ip: requester_ip}) 
      Intercom.intercom_activity(Application.get_env(:evercam_media, :create_intercom_user), get_user_model(email), get_user_agent(conn), requester_ip, "Shared-Non-Registered") 
      {shares, [camera_share_request | share_requests], changes} 
     {:error, changeset} -> 
      {shares, share_requests, [attach_email_to_message(changeset, email) | changes]} 
     end 
    end 
end) 
+0

Pourquoi ne pas stocker la valeur actuelle de 'done_at' dans l'accumulateur et ainsi augmenter dans chaque itération? – Dogbert

+0

Je suis seulement inquiet au sujet des augmentations. comment faire ça? –

+0

Vous ne savez pas non plus comment l'enregistrer dans l'accumulateur, l'accumulateur réel est également appris de vous dans la question précédente –

Répondre

1

Vous avez déjà 3-tuple comme l'accumulateur dans l'appel Enum.reduce/3. Vous pouvez ajouter une valeur datetime en tant que 4ème élément dans le tuple et l'incrémenter à chaque itération. Par exemple, pour incrémenter de 5 secondes, vous pouvez faire:

Enum.reduce(email_array, {[], [], [], Ecto.DateTime.utc}, fn email, {shares, share_requests, changes, datetime} = _acc -> 
    # next_datetime is datetime + 5 seconds 
    next_datetime = datetime |> 
    Ecto.DateTime.to_erl |> 
    :calendar.datetime_to_gregorian_seconds |> 
    Kernel.+(5) |> 
    :calendar.gregorian_seconds_to_datetime |> 
    Ecto.DateTime.from_erl 

    # `next_datetime` should be returned as the 4th value of each tuple below. 
    # `datetime` can be used as the current value. 

    with {:found_user, sharee} <- ensure_user(email) 
    do 
    case CameraShare.create_share(camera, sharee, caller, params["rights"], params["message"]) do 
     {:ok, camera_share} -> 
     ... 
     {[camera_share | shares], share_requests, changes, next_datetime} 
     {:error, changeset} -> 
     {shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime} 
    end 
    else 
    {:not_found, email} -> 
     case CameraShareRequest.create_share_request(camera, email, caller, params["rights"], params["message"]) do 
     {:ok, camera_share_request} -> 
      ... 
      {shares, [camera_share_request | share_requests], changes, next_datetime} 
     {:error, changeset} -> 
      {shares, share_requests, [attach_email_to_message(changeset, email) | changes], next_datetime} 
     end 
    end 
end)