Improve Task Chain
parent
2cb21dc102
commit
865e83cdae
|
@ -31,30 +31,52 @@ type as a message to the Vault to update certain information.
|
|||
-}
|
||||
|
||||
import Http
|
||||
import Internal.Api.Helpers as Helpers
|
||||
import Internal.Tools.Context as Context exposing (Context)
|
||||
import Internal.Tools.Exceptions as X
|
||||
import Task exposing (Task)
|
||||
|
||||
{-| The TaskChain is a piece in the long chain of tasks that need to be completed.
|
||||
The type defines four variables:
|
||||
|
||||
- `err` value that may arise on an error
|
||||
- `u` the update msg that should be returned
|
||||
- `a` phantom type before executing the chain's context
|
||||
- `b` phantom type after executing the chain's context
|
||||
-}
|
||||
type alias TaskChain err u a b =
|
||||
Context a -> Task (FailedChainPiece err u) (TaskChainPiece u a b)
|
||||
|
||||
{-| An IdemChain is a TaskChain that does not influence the chain's context
|
||||
|
||||
- `err` value that may arise on an error
|
||||
- `u` the update msg that should be executed
|
||||
- `a` phantom type before, during and after the chain's context
|
||||
-}
|
||||
type alias IdemChain err u a =
|
||||
TaskChain err u a a
|
||||
|
||||
|
||||
{-| A CompleteChain is a complete snake that can be safely run and executed by
|
||||
the Elm core.
|
||||
-}
|
||||
type alias CompleteChain u =
|
||||
TaskChain () u {} {}
|
||||
|
||||
{-| A TaskChainPiece is a piece that updates the chain's context.
|
||||
|
||||
Once a chain is executed, the process will add the `messages` value to its list
|
||||
of updates, and it will update its context according to the `contextChange`
|
||||
function.
|
||||
-}
|
||||
type alias TaskChainPiece u a b =
|
||||
{ contextChange : Context a -> Context b
|
||||
, messages : List u
|
||||
}
|
||||
|
||||
|
||||
{-| A FailedChainPiece initiates an early breakdown of a chain. Unless caught,
|
||||
this halts execution of the chain. The process will add the `messages` value to
|
||||
its list of updates, and it will return the given `err` value for a direct
|
||||
explanation of what went wrong.
|
||||
-}
|
||||
type alias FailedChainPiece err u =
|
||||
{ error : err, messages : List u }
|
||||
|
||||
|
|
|
@ -37,46 +37,3 @@ ratelimited task =
|
|||
_ ->
|
||||
Task.fail e
|
||||
)
|
||||
|
||||
|
||||
{-| Sometimes, you don't really care if something went wrong - you just want to try again.
|
||||
|
||||
This task will only return an error if it went wrong on the n'th attempt.
|
||||
|
||||
-}
|
||||
retryTask : Int -> Task X.Error a -> Task X.Error a
|
||||
retryTask n task =
|
||||
if n <= 0 then
|
||||
task
|
||||
|
||||
else
|
||||
Task.onError
|
||||
(\err ->
|
||||
let
|
||||
retry : Task X.Error a
|
||||
retry =
|
||||
retryTask (n - 1) task
|
||||
in
|
||||
case err of
|
||||
X.InternetException (Http.BadUrl _) ->
|
||||
Task.fail err
|
||||
|
||||
X.InternetException _ ->
|
||||
retry
|
||||
|
||||
X.SDKException (X.ServerReturnsBadJSON _) ->
|
||||
retry
|
||||
|
||||
X.SDKException _ ->
|
||||
Task.fail err
|
||||
|
||||
X.ServerException _ ->
|
||||
Task.fail err
|
||||
|
||||
X.ContextFailed _ ->
|
||||
Task.fail err
|
||||
|
||||
X.UnsupportedSpecVersion ->
|
||||
Task.fail err
|
||||
)
|
||||
task
|
||||
|
|
|
@ -16,7 +16,7 @@ import Internal.Values.Room as Internal
|
|||
import Internal.Values.StateManager as StateManager
|
||||
import Internal.Values.Timeline as Timeline
|
||||
import Json.Encode as E
|
||||
import Task exposing (Task)
|
||||
import Task
|
||||
|
||||
|
||||
{-| The `Room` type represents a Matrix Room. It contains context information
|
||||
|
|
|
@ -432,3 +432,8 @@ sync vault onResponse =
|
|||
rooms : Vault -> List Room.Room
|
||||
rooms =
|
||||
Snackbar.mapList Internal.getRooms
|
||||
|
||||
|
||||
settings : (Snackbar.Settings -> Snackbar.Settings) -> Vault -> Vault
|
||||
settings =
|
||||
Snackbar.updateSettings
|
||||
|
|
|
@ -33,10 +33,8 @@ interact with the API.
|
|||
import Internal.Api.VaultUpdate as Api
|
||||
import Internal.Invite exposing (RoomInvite)
|
||||
import Internal.Room exposing (Room)
|
||||
import Internal.Tools.Exceptions as X
|
||||
import Internal.Vault
|
||||
import Json.Encode as E
|
||||
import Task exposing (Task)
|
||||
|
||||
|
||||
{-| The Matrix API requires you to keep track of a lot of tokens, keys, values and more.
|
||||
|
@ -58,6 +56,13 @@ translate those instructions to a `VaultUpdate` that you can feed to your `Vault
|
|||
type alias VaultUpdate =
|
||||
Api.VaultUpdate
|
||||
|
||||
{-| After evaluating an update, the `Status` type tells you how the Vault.
|
||||
-}
|
||||
type Status
|
||||
= Good
|
||||
| Warning String ((VaultUpdate -> msg) -> Cmd msg)
|
||||
| Break String ((VaultUpdate -> msg) -> Cmd msg)
|
||||
|
||||
|
||||
{-| Create a new vault based on an access token.
|
||||
Keep in mind that access tokens might eventually be revoked or expire,
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
# Design refactors to be made
|
||||
|
||||
The following refactors are to be made:
|
||||
|
||||
- We need an `Info` type that informs the user whether data exists, and if not, why it doesn't exist.
|
||||
|
||||
- We need a `Timeline` type that users can use to go through threads in the global room timeline.
|
Loading…
Reference in New Issue