BadScript 2
Loading...
Searching...
No Matches
RailwaySharp.ErrorHandling.Trial Class Reference

Static Public Member Functions

static Result< TSuccess, TMessage > Ok< TSuccess, TMessage > (TSuccess value)
 Wraps a value in a Success.
 
static Result< TSuccess, TMessage > Pass< TSuccess, TMessage > (TSuccess value)
 Wraps a value in a Success.
 
static Result< TSuccess, TMessage > Warn< TSuccess, TMessage > (TMessage message, TSuccess value)
 Wraps a value in a Success and adds a message.
 
static Result< TSuccess, TMessage > Fail< TSuccess, TMessage > (TMessage message)
 Wraps a message in a Failure.
 
static bool Failed< TSuccess, TMessage > (Result< TSuccess, TMessage > result)
 Returns true if the result was not successful.
 
static TResult Either< TSuccess, TMessage, TResult > (Func< TSuccess, IEnumerable< TMessage >, TResult > successFunc, Func< IEnumerable< TMessage >, TResult > failureFunc, Result< TSuccess, TMessage > trialResult)
 Takes a Result and maps it with successFunc if it is a Success otherwise it maps it with failureFunc.
 
static TSuccess ReturnOrFail< TSuccess, TMessage > (Result< TSuccess, TMessage > result)
 If the given result is a Success the wrapped value will be returned. Otherwise the function throws an exception with Failure message of the result.
 
static Result< TSuccess, TMessage > MergeMessages< TSuccess, TMessage > (IEnumerable< TMessage > messages, Result< TSuccess, TMessage > result)
 Appends the given messages with the messages in the given result.
 
static Result< TSuccess, TMessage > Bind< TValue, TSuccess, TMessage > (Func< TValue, Result< TSuccess, TMessage > > func, Result< TValue, TMessage > result)
 If the result is a Success it executes the given function on the value. Otherwise the exisiting failure is propagated.
 
static Result< TSuccess, TMessage > Flatten< TSuccess, TMessage > (Result< Result< TSuccess, TMessage >, TMessage > result)
 Flattens a nested result given the Failure types are equal.
 
static Result< TSuccess, TMessage > Apply< TValue, TSuccess, TMessage > (Result< Func< TValue, TSuccess >, TMessage > wrappedFunction, Result< TValue, TMessage > result)
 If the wrapped function is a success and the given result is a success the function is applied on the value. Otherwise the exisiting error messages are propagated.
 
static Result< TSuccess, TMessage > Lift< TValue, TSuccess, TMessage > (Func< TValue, TSuccess > func, Result< TValue, TMessage > result)
 Lifts a function into a Result container and applies it on the given result.
 
static Result< TSuccess1, TMessage1 > Lift2< TSuccess, TMessage, TSuccess1, TMessage1 > (Func< TSuccess, Func< TMessage, TSuccess1 > > func, Result< TSuccess, TMessage1 > first, Result< TMessage, TMessage1 > second)
 Promote a function to a monad/applicative, scanning the monadic/applicative arguments from left to right.
 
static Result< IEnumerable< TSuccess >, TMessage > Collect< TSuccess, TMessage > (IEnumerable< Result< TSuccess, TMessage > > xs)
 Collects a sequence of Results and accumulates their values. If the sequence contains an error the error will be propagated.
 

Detailed Description

Definition at line 209 of file ErrorHandling.cs.

Member Function Documentation

◆ Apply< TValue, TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Apply< TValue, TSuccess, TMessage > ( Result< Func< TValue, TSuccess >, TMessage >  wrappedFunction,
Result< TValue, TMessage >  result 
)
static

If the wrapped function is a success and the given result is a success the function is applied on the value. Otherwise the exisiting error messages are propagated.

Definition at line 401 of file ErrorHandling.cs.

404 {
405 if (wrappedFunction == null)
406 {
407 throw new ArgumentException(nameof(wrappedFunction));
408 }
409
410 if (wrappedFunction.Tag == ResultType.Ok && result.Tag == ResultType.Ok)
411 {
412 Ok<Func<TValue, TSuccess>, TMessage> ok1 = (Ok<Func<TValue, TSuccess>, TMessage>)wrappedFunction;
413 Ok<TValue, TMessage> ok2 = (Ok<TValue, TMessage>)result;
414
415 return new Ok<TSuccess, TMessage>(ok1.Success(ok2.Success),
416 ok1.Messages.Concat(ok2.Messages)
417 );
418 }
419
420 if (wrappedFunction.Tag == ResultType.Bad && result.Tag == ResultType.Ok)
421 {
422 return new Bad<TSuccess, TMessage>(((Bad<TValue, TMessage>)result).Messages);
423 }
424
425 if (wrappedFunction.Tag == ResultType.Ok && result.Tag == ResultType.Bad)
426 {
427 return new Bad<TSuccess, TMessage>(((Bad<TValue, TMessage>)result).Messages);
428 }
429
430 Bad<Func<TValue, TSuccess>, TMessage> bad1 = (Bad<Func<TValue, TSuccess>, TMessage>)wrappedFunction;
431 Bad<TValue, TMessage> bad2 = (Bad<TValue, TMessage>)result;
432
433 return new Bad<TSuccess, TMessage>(bad1.Messages.Concat(bad2.Messages));
434 }
static Result< TSuccess, TMessage > Ok< TSuccess, TMessage >(TSuccess value)
Wraps a value in a Success.

◆ Bind< TValue, TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Bind< TValue, TSuccess, TMessage > ( Func< TValue, Result< TSuccess, TMessage > >  func,
Result< TValue, TMessage >  result 
)
static

If the result is a Success it executes the given function on the value. Otherwise the exisiting failure is propagated.

Definition at line 364 of file ErrorHandling.cs.

367 {
368 if (func == null)
369 {
370 throw new ArgumentException(nameof(func));
371 }
372
373 Func<TValue, IEnumerable<TMessage>, Result<TSuccess, TMessage>> successFunc =
374 (succ, msgs) => MergeMessages(msgs, func(succ));
375
376 Func<IEnumerable<TMessage>, Result<TSuccess, TMessage>> failureFunc =
377 messages => new Bad<TSuccess, TMessage>(messages);
378
379 return Either(successFunc, failureFunc, result);
380 }

◆ Collect< TSuccess, TMessage >()

static Result< IEnumerable< TSuccess >, TMessage > RailwaySharp.ErrorHandling.Trial.Collect< TSuccess, TMessage > ( IEnumerable< Result< TSuccess, TMessage > >  xs)
static

Collects a sequence of Results and accumulates their values. If the sequence contains an error the error will be propagated.

Definition at line 469 of file ErrorHandling.cs.

471 {
472 return Lift(Enumerable.Reverse,
473 xs.Aggregate<Result<TSuccess, TMessage>, Result<IEnumerable<TSuccess>, TMessage>,
474 Result<IEnumerable<TSuccess>, TMessage>>(null,
475 (result, next) =>
476 {
477 if (result.Tag == ResultType.Ok &&
478 next.Tag == ResultType.Ok)
479 {
480 Ok<IEnumerable<TSuccess>, TMessage> ok1 =
481 (Ok<IEnumerable<TSuccess>, TMessage>)
482 result;
483
484 Ok<TSuccess, TMessage> ok2 =
485 (Ok<TSuccess, TMessage>)next;
486
487 return
488 new Ok<IEnumerable<TSuccess>,
489 TMessage>(Enumerable
490 .Empty<TSuccess>()
491 .Concat(new[] { ok2.Success }
492 )
493 .Concat(ok1.Success),
494 ok1.Messages.Concat(ok2.Messages)
495 );
496 }
497
498 if ((result.Tag == ResultType.Ok &&
499 next.Tag == ResultType.Bad) ||
500 (result.Tag == ResultType.Bad &&
501 next.Tag == ResultType.Ok))
502 {
503 IEnumerable<TMessage> m1 =
504 result.Tag == ResultType.Ok
505 ? ((Ok<IEnumerable<TSuccess>,
506 TMessage>)result)
507 .Messages
508 : ((Bad<TSuccess, TMessage>)next)
509 .Messages;
510
511 IEnumerable<TMessage> m2 =
512 result.Tag == ResultType.Bad
513 ? ((Bad<IEnumerable<TSuccess>,
514 TMessage>)result)
515 .Messages
516 : ((Ok<TSuccess, TMessage>)next)
517 .Messages;
518
519 return new Bad<IEnumerable<TSuccess>,
520 TMessage>(m1.Concat(m2));
521 }
522
523 Bad<IEnumerable<TSuccess>, TMessage> bad1 =
524 (Bad<IEnumerable<TSuccess>, TMessage>)
525 result;
526
527 Bad<TSuccess, TMessage> bad2 =
528 (Bad<TSuccess, TMessage>)next;
529
530 return new
531 Bad<IEnumerable<TSuccess>, TMessage>(bad1
532 .Messages.Concat(bad2.Messages)
533 );
534 },
535 x => x
536 )
537 );
538 }

◆ Either< TSuccess, TMessage, TResult >()

static TResult RailwaySharp.ErrorHandling.Trial.Either< TSuccess, TMessage, TResult > ( Func< TSuccess, IEnumerable< TMessage >, TResult >  successFunc,
Func< IEnumerable< TMessage >, TResult >  failureFunc,
Result< TSuccess, TMessage >  trialResult 
)
static

Takes a Result and maps it with successFunc if it is a Success otherwise it maps it with failureFunc.

Definition at line 284 of file ErrorHandling.cs.

288 {
289 if (successFunc == null)
290 {
291 throw new ArgumentException(nameof(successFunc));
292 }
293
294 if (failureFunc == null)
295 {
296 throw new ArgumentException(nameof(failureFunc));
297 }
298
300
301 if (ok != null)
302 {
303 return successFunc(ok.Success, ok.Messages);
304 }
305
306 Bad<TSuccess, TMessage> bad = (Bad<TSuccess, TMessage>)trialResult;
307
308 return failureFunc(bad.Messages);
309 }

◆ Fail< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Fail< TSuccess, TMessage > ( TMessage  message)
static

Wraps a message in a Failure.

Definition at line 257 of file ErrorHandling.cs.

258 {
259 if (message == null)
260 {
261 throw new ArgumentException(nameof(message));
262 }
263
264 return new Bad<TSuccess, TMessage>(new[] { message });
265 }

◆ Failed< TSuccess, TMessage >()

static bool RailwaySharp.ErrorHandling.Trial.Failed< TSuccess, TMessage > ( Result< TSuccess, TMessage >  result)
static

Returns true if the result was not successful.

Definition at line 273 of file ErrorHandling.cs.

274 {
275 return result.Tag == ResultType.Bad;
276 }

◆ Flatten< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Flatten< TSuccess, TMessage > ( Result< Result< TSuccess, TMessage >, TMessage >  result)
static

Flattens a nested result given the Failure types are equal.

Definition at line 388 of file ErrorHandling.cs.

390 {
391 return Bind(x => x, result);
392 }

◆ Lift2< TSuccess, TMessage, TSuccess1, TMessage1 >()

static Result< TSuccess1, TMessage1 > RailwaySharp.ErrorHandling.Trial.Lift2< TSuccess, TMessage, TSuccess1, TMessage1 > ( Func< TSuccess, Func< TMessage, TSuccess1 > >  func,
Result< TSuccess, TMessage1 >  first,
Result< TMessage, TMessage1 >  second 
)
static

Promote a function to a monad/applicative, scanning the monadic/applicative arguments from left to right.

Definition at line 454 of file ErrorHandling.cs.

458 {
459 return Apply(Lift(func, first), second);
460 }

◆ Lift< TValue, TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Lift< TValue, TSuccess, TMessage > ( Func< TValue, TSuccess >  func,
Result< TValue, TMessage >  result 
)
static

Lifts a function into a Result container and applies it on the given result.

Definition at line 442 of file ErrorHandling.cs.

444 {
445 return Apply(Ok<Func<TValue, TSuccess>, TMessage>(func), result);
446 }

◆ MergeMessages< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.MergeMessages< TSuccess, TMessage > ( IEnumerable< TMessage >  messages,
Result< TSuccess, TMessage >  result 
)
static

Appends the given messages with the messages in the given result.

Definition at line 337 of file ErrorHandling.cs.

339 {
340 if (messages == null)
341 {
342 throw new ArgumentException(nameof(messages));
343 }
344
345 Func<TSuccess, IEnumerable<TMessage>, Result<TSuccess, TMessage>> successFunc =
346 (succ, msgs) =>
347 new Ok<TSuccess, TMessage>(succ,
348 messages.Concat(msgs)
349 );
350
351 Func<IEnumerable<TMessage>, Result<TSuccess, TMessage>> failureFunc =
352 errors => new Bad<TSuccess, TMessage>(errors.Concat(messages));
353
354 return Either(successFunc, failureFunc, result);
355 }

◆ Ok< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Ok< TSuccess, TMessage > ( TSuccess  value)
static

Wraps a value in a Success.

Definition at line 217 of file ErrorHandling.cs.

218 {
219 return new Ok<TSuccess, TMessage>(value, Enumerable.Empty<TMessage>());
220 }

◆ Pass< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Pass< TSuccess, TMessage > ( TSuccess  value)
static

Wraps a value in a Success.

Definition at line 228 of file ErrorHandling.cs.

229 {
230 return new Ok<TSuccess, TMessage>(value, Enumerable.Empty<TMessage>());
231 }

◆ ReturnOrFail< TSuccess, TMessage >()

static TSuccess RailwaySharp.ErrorHandling.Trial.ReturnOrFail< TSuccess, TMessage > ( Result< TSuccess, TMessage >  result)
static

If the given result is a Success the wrapped value will be returned. Otherwise the function throws an exception with Failure message of the result.

Definition at line 318 of file ErrorHandling.cs.

319 {
320 Func<IEnumerable<TMessage>, TSuccess> raiseExn = msgs =>
321 {
322 throw new Exception(string.Join(Environment.NewLine,
323 msgs.Select(m => m.ToString())
324 )
325 );
326 };
327
328 return Either((succ, _) => succ, raiseExn, result);
329 }

◆ Warn< TSuccess, TMessage >()

static Result< TSuccess, TMessage > RailwaySharp.ErrorHandling.Trial.Warn< TSuccess, TMessage > ( TMessage  message,
TSuccess  value 
)
static

Wraps a value in a Success and adds a message.

Definition at line 239 of file ErrorHandling.cs.

240 {
241 if (message == null)
242 {
243 throw new ArgumentException(nameof(message));
244 }
245
246 return new Ok<TSuccess, TMessage>(value,
247 new[] { message }
248 );
249 }

The documentation for this class was generated from the following file: