Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@sir-wabbit
Copy link

@sir-wabbit sir-wabbit commented Mar 22, 2020

Addresses incorrectly closed #2341.

Example of usage from work:

  def headerSink(headerConfig: HeaderConfig): ZSink[Any, StreamError, Arr[String], Arr[String], List[String]] = (for {
    _ <- skip[Arr[String]](headerConfig.skipBefore)

    result <- headerConfig.headerOverride match {
      case Some((true, list)) =>
        get[Arr[String]] *> ZSink.succeed[Arr[String], List[String]](list)
      case Some((false, list)) =>
        ZSink.succeed[Arr[String], List[String]](list)
      case None =>
        get[Arr[String]].map(_.toList)
    }

    _ <- skip[Arr[String]](headerConfig.skipAfter)
  } yield result).mapError(_ => StreamError.NoHeader())

  // A different way to implement skip.
  def skip[A](n: Long): ZSink[Any, Unit, Nothing, A, Unit] =
    ZSink.foldUntil[Long, A](0L, n)((s, _) => s + 1).flatMap {
      case m if n != m => ZSink.fail(())
      case _           => ZSink.succeed(())
    }
  
  // This is also known as ZSink.identity but it's a weird name.
  def get[A]: ZSink[Any, Unit, A, A, A] =
    ZSink.foldUntil[Option[A], A](None, 1)((_, a) => Some(a)).flatMap {
      case None    => ZSink.fail(())
      case Some(a) => ZSink.succeed(a)
    }

🤔 drop(n) = skip(n).optional.as(())?

@sir-wabbit
Copy link
Author

Spurious test_212_jdk8_js failure. Is there a way to restart?

@adamgfraser
Copy link
Contributor

Will rerun.

Copy link
Member

@iravid iravid left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💪🏻

@iravid iravid merged commit 81e06d3 into zio:master Mar 23, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add skip to ZSink/Sink

4 participants