Skip to content

Instantly share code, notes, and snippets.

View matthughes's full-sized avatar

Matt Hughes matthughes

View GitHub Profile

** Adapted from an answer in the FS2 gitter channel by Fabio Labella: https://gitter.im/functional-streams-for-scala/fs2?at=5e962ebb6823cb38acd12ebd

What is Stream.compile and what does it do? Is it actually compiling something? Optimizing the streaming somehow?

At its core, Stream[I, O].compile is nothing more than a namespace for related methods that return the same type wrapper, I. It's not compiling anything or doing any optimization. For example, all the methods on (s: Stream[IO, Int]).compile generally have the return type IO.

In FP there is a technique of design through algebras (speaking here in the most general sense, even more general than tagless final) and it basically works like this:

  • you have some type, for example Option
  • some introduction forms (ways of getting "into" the algebra, e.g., Option.empty, Option.some; this is often referred to as "lifting" into a type)
//> using scala "3.1.2"
//> using lib "co.fs2::fs2-core:3.2.7"
//> using lib "co.fs2::fs2-io:3.2.7"
//> using lib "org.http4s::http4s-core:0.23.11"
//> using lib "org.http4s::http4s-dsl:0.23.11"
//> using lib "org.http4s::http4s-ember-client:0.23.11"
import fs2.Stream
import cats.effect._
import cats.syntax.all._
@matthughes
matthughes / md_slack.rb
Last active March 6, 2024 21:21 — forked from h6y3/md_slack.rb
Obsidian Markdown to Slack
#!/usr/bin/env ruby
# Read from stdin rather than file.
file_data = $stdin.read
# Upper case title
re = /^#* .+/
file_data.gsub!(re) { |match| "*#{match.upcase}*"}
# Mutate todos