Skip to content

Instantly share code, notes, and snippets.

@pathikrit
pathikrit / ask_gpt.js
Created September 26, 2023 18:56
Minimal node.js code to ask ChatGPT
import {ChatCompletionRequestMessageRoleEnum as Role, OpenAIApi} from "openai";
import {Configuration as OpenAIConfig} from "openai/dist/configuration.js";
const OPENAI_API_KEY = 'XXXXXXXXXXXXXX'
const openai = new OpenAIApi(new OpenAIConfig({apiKey: OPENAI_API_KEY}))
const ask = (query) => {
return openai.createChatCompletion({
model: 'gpt-3.5-turbo',
max_tokens: 2048,
@pathikrit
pathikrit / chron.scala
Last active June 25, 2022 21:52
Chron.scala
// A simply port of Google Task's recurring task scheduler to Scala 3 ADT:
// https://tasks.google.com/embed/?origin=https://calendar.google.com&fullWidth=1
import java.time._
enum Cadence:
case Daily
case Weekly(on: Set[DayOfWeek] = Set(DayOfWeek.SUNDAY))
case Monthly(on: Set[DayOfMonth] = Set(DayOfMonth.Day(1)))
case Yearly(on: Set[MonthDay] = Set(MonthDay.of(1, 1)))
@pathikrit
pathikrit / Fees.scala
Last active August 27, 2021 15:08
Incur Credit Card Fees or Not?
import squants.Dimensionless
import squants.DimensionlessConversions._
import squants.market._, MoneyConversions._
case class CreditCard(name: String, points: Dimensionless, checkingAPR: Dimensionless) {
def charge(amount: Money, fee: Dimensionless = 0 percent, flatFee: Money = 0 dollars): String = {
val fees = amount*fee + flatFee
val interestEarned = amount * checkingAPR/12
val cashBack = (amount + fees)*points
val saved = cashBack - interestEarned - fees
@pathikrit
pathikrit / Morph.scala
Created April 29, 2020 15:07
Case class morpher in scala
import shapeless._, syntax.singleton._, record._, ops.hlist._
/**
* Given an instance A and it's generic representation AR and function f from AR => BR
* we can covert A to B if we also have the generic representation of BR as B
* We also handle misalignments using shapeless's align typeclass (https://stackoverflow.com/questions/29242873/shapeless-turn-a-case-class-into-another-with-fields-in-different-order)
*/
case class Morph[A, AR](a: A)(implicit reprA: LabelledGeneric.Aux[A, AR]) {
// Why this DSL you say? Hack to get around scalac idiocy: https://stackoverflow.com/a/46614684/471136
def to[B] = new {
@pathikrit
pathikrit / GzipSplitter.scala
Last active December 12, 2019 21:29
Split a file into multiple GZIP files
import java.io.InputStream
import better.files._
import squants.information._, InformationConversions._
object GzipSplitter {
/** Splits the $inputstream into approximately equal chunks of $splitSize gzip files under $outputDirectory */
def split(
inputStream : InputStream,
outputDirectory : File = File.newTemporaryDirectory(),
@pathikrit
pathikrit / SparkDataLoad.scala
Last active June 1, 2020 15:03
Spark utils to ship data
import java.nio.charset.{ Charset, StandardCharsets }
import org.apache.spark.sql._
import org.apache.spark.sql.types._
object SparkDataLoad {
def fromCsv[A : Encoder](
path: Set[String],
encoding: Charset = StandardCharsets.UTF_8,
useHeader: Boolean = false,
@pathikrit
pathikrit / SphericalDistance.scala
Last active September 24, 2019 19:06
Distance calculator between 2 coordinates on a planet
/** Distance between 2 coordinates (in degrees) */
def dist(
p1: (Double, Double), // Coordinate 1 (in degrees)
p2: (Double, Double), // Coordinate 2 (in degrees)
manhattanDist: Boolean = false, // If true, calculate Manhattan distance on the sphere :)
diameter: Double = 7917.5 // Diameter of Earth in miles; set this to whatever planet/units you want
): Double = {
import Math._
def haversine(theta: Double) = (1 - cos(theta))/2
@pathikrit
pathikrit / BooleanMonitor.scala
Last active August 16, 2019 13:05
Boolean Monitor
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.Duration
import com.google.common.util.concurrent.Monitor
class BooleanMonitor(monitor: Monitor = new Monitor())(check: => Boolean) {
private val guard = new Monitor.Guard(monitor) { override def isSatisfied = check }
def whenSatisfied[U](timeout: Duration = Duration.Inf)(f: => U): U = {
@pathikrit
pathikrit / SparkSchemaDsl.scala
Created July 12, 2019 13:01
Spark Schema DSL
import org.apache.spark.sql.types._
import org.apache.spark.sql._
object SchemaDsl {
case class ScalaToSparkType[ScalaType](sparkType: DataType, isNullable: Boolean = false) {
def toField(name: String) = StructField(name = name, dataType = sparkType, nullable = isNullable)
}
implicit val stringType: ScalaToSparkType[String] = ScalaToSparkType(StringType)
implicit val intType: ScalaToSparkType[Int] = ScalaToSparkType(IntegerType)
@pathikrit
pathikrit / script.scala
Last active December 12, 2018 19:50
Move duplicate files to a directory
import better.files._
def moveDupes(
dir: File,
logFile: File = (File.home / "dupes.txt"),
dupeFolder: File = (File.home / 'dupes).createDirectory()
) = {
for {
log <- logFile.printWriter()
(hash, toKeep :: toMove) <- dir.listRecursively.toSeq.groupBy(_.md5).mapValues(_.toList)