Created
July 24, 2015 23:35
-
-
Save ankurcha/624a4cf929913cd6891b to your computer and use it in GitHub Desktop.
Function to convert a stream of events into the "state" of the stream. The presence of a Bad event determines if it is errored before play request or after.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // events | |
| trait Event | |
| sealed abstract class BadEvent() extends Event | |
| sealed abstract class GoodEvent() extends Event | |
| sealed case class Ping() extends GoodEvent | |
| sealed case class PlayRequest() extends GoodEvent | |
| sealed case class Buffer() extends BadEvent | |
| // stream states | |
| trait StreamState | |
| sealed class OK() extends StreamState | |
| sealed class Error() extends StreamState | |
| sealed case class Success() extends OK | |
| sealed case class Failure() extends Error | |
| sealed case class OKBeforePlayRequest() extends OK | |
| sealed case class ErrorBeforePlayRequest() extends Error | |
| sealed case class ErrorAfterPlayRequest() extends Error | |
| // stream of events to state | |
| def toStreamState(stream: Seq[Event], startState: StreamState = Success()): StreamState = { | |
| stream.foldLeft(startState)((head: StreamState, current: Event) => { | |
| (head, current) match { | |
| case (_: OKBeforePlayRequest, y: Event) => | |
| y match { | |
| case _: PlayRequest => OKBeforePlayRequest() | |
| case _: GoodEvent => Success() | |
| case _: BadEvent => ErrorAfterPlayRequest() | |
| } | |
| case (_: ErrorAfterPlayRequest, _: Event) => ErrorAfterPlayRequest() | |
| case (_: ErrorBeforePlayRequest, _: Event) => ErrorBeforePlayRequest() | |
| case (_: OK, y: Event) => | |
| y match { | |
| case _: PlayRequest => OKBeforePlayRequest() | |
| case _: GoodEvent => Success() | |
| case _: BadEvent => Failure() | |
| } | |
| case (_: Error, y: Event) => | |
| y match { | |
| case _: PlayRequest => ErrorBeforePlayRequest() | |
| case _: GoodEvent => Success() | |
| case _: BadEvent => Failure() | |
| } | |
| } | |
| }) | |
| } | |
| // test | |
| def test() = { | |
| val stream1 = Seq( Ping(), Ping(), PlayRequest(), Ping(), Ping() ) // success | |
| val stream2 = Seq( Ping(), Ping(), PlayRequest(), Buffer(), Ping() ) // error after play | |
| val stream3 = Seq( Ping(), Buffer(), PlayRequest(), Ping(), Ping() ) // error before play | |
| val r1 = toStreamState(stream = stream1) | |
| val r2 = toStreamState(stream = stream2) | |
| val r3 = toStreamState(stream = stream3) | |
| Seq(r1, r2, r3) | |
| } | |
| // run test | |
| test() |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Version 2 (much cleaner):