refactor(users/glittershark): Rename to grfn

Rename my //users directory and all places that refer to glittershark to
grfn, including nix references and documentation.

This may require some extra attention inside of gerrit's database after
it lands to allow me to actually push things.

Change-Id: I4728b7ec2c60024392c1c1fa6e0d4a59b3e266fa
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2933
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: lukegb <lukegb@tvl.fyi>
Reviewed-by: glittershark <grfn@gws.fyi>
This commit is contained in:
Griffin Smith 2021-04-11 17:53:27 -04:00 committed by glittershark
parent 968effb5dc
commit 6266c5d32f
362 changed files with 52 additions and 56 deletions

View file

@ -0,0 +1,59 @@
use std::borrow::Borrow;
use std::collections::HashMap;
use std::hash::Hash;
use std::mem;
/// A lexical environment
#[derive(Debug, PartialEq, Eq)]
pub struct Env<K: Eq + Hash, V>(Vec<HashMap<K, V>>);
impl<K, V> Default for Env<K, V>
where
K: Eq + Hash,
{
fn default() -> Self {
Self::new()
}
}
impl<K, V> Env<K, V>
where
K: Eq + Hash,
{
pub fn new() -> Self {
Self(vec![Default::default()])
}
pub fn push(&mut self) {
self.0.push(Default::default());
}
pub fn pop(&mut self) {
self.0.pop();
}
pub fn save(&mut self) -> Self {
mem::take(self)
}
pub fn restore(&mut self, saved: Self) {
*self = saved;
}
pub fn set(&mut self, k: K, v: V) {
self.0.last_mut().unwrap().insert(k, v);
}
pub fn resolve<'a, Q>(&'a self, k: &Q) -> Option<&'a V>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
for ctx in self.0.iter().rev() {
if let Some(res) = ctx.get(k) {
return Some(res);
}
}
None
}
}

View file

@ -0,0 +1,59 @@
use std::{io, result};
use thiserror::Error;
use crate::{codegen, interpreter, parser, tc};
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
IOError(#[from] io::Error),
#[error("Error parsing input: {0}")]
ParseError(#[from] parser::Error),
#[error("Error evaluating expression: {0}")]
EvalError(#[from] interpreter::Error),
#[error("Compile error: {0}")]
CodegenError(#[from] codegen::Error),
#[error("Type error: {0}")]
TypeError(#[from] tc::Error),
#[error("{0}")]
Message(String),
}
impl From<String> for Error {
fn from(s: String) -> Self {
Self::Message(s)
}
}
impl<'a> From<&'a str> for Error {
fn from(s: &'a str) -> Self {
Self::Message(s.to_owned())
}
}
impl<'a> From<nom::Err<nom::error::Error<&'a str>>> for Error {
fn from(e: nom::Err<nom::error::Error<&'a str>>) -> Self {
use nom::error::Error as NomError;
use nom::Err::*;
Self::ParseError(match e {
Incomplete(i) => Incomplete(i),
Error(NomError { input, code }) => Error(NomError {
input: input.to_owned(),
code,
}),
Failure(NomError { input, code }) => Failure(NomError {
input: input.to_owned(),
code,
}),
})
}
}
pub type Result<T> = result::Result<T, Error>;

View file

@ -0,0 +1,6 @@
pub(crate) mod env;
pub(crate) mod error;
pub(crate) mod namer;
pub use error::{Error, Result};
pub use namer::{Namer, NamerOf};

View file

@ -0,0 +1,122 @@
use std::fmt::Display;
use std::marker::PhantomData;
pub struct Namer<T, F> {
make_name: F,
counter: u64,
_phantom: PhantomData<T>,
}
impl<T, F> Namer<T, F> {
pub fn new(make_name: F) -> Self {
Namer {
make_name,
counter: 0,
_phantom: PhantomData,
}
}
}
impl Namer<String, Box<dyn Fn(u64) -> String>> {
pub fn with_prefix<T>(prefix: T) -> Self
where
T: Display + 'static,
{
Namer::new(move |i| format!("{}{}", prefix, i)).boxed()
}
pub fn with_suffix<T>(suffix: T) -> Self
where
T: Display + 'static,
{
Namer::new(move |i| format!("{}{}", i, suffix)).boxed()
}
pub fn alphabetic() -> Self {
Namer::new(|i| {
if i <= 26 {
std::char::from_u32((i + 96) as u32).unwrap().to_string()
} else {
format!(
"{}{}",
std::char::from_u32(((i % 26) + 96) as u32).unwrap(),
i - 26
)
}
})
.boxed()
}
}
impl<T, F> Namer<T, F>
where
F: Fn(u64) -> T,
{
pub fn make_name(&mut self) -> T {
self.counter += 1;
(self.make_name)(self.counter)
}
pub fn boxed(self) -> NamerOf<T>
where
F: 'static,
{
Namer {
make_name: Box::new(self.make_name),
counter: self.counter,
_phantom: self._phantom,
}
}
pub fn map<G, U>(self, f: G) -> NamerOf<U>
where
G: Fn(T) -> U + 'static,
T: 'static,
F: 'static,
{
Namer {
counter: self.counter,
make_name: Box::new(move |x| f((self.make_name)(x))),
_phantom: PhantomData,
}
}
}
pub type NamerOf<T> = Namer<T, Box<dyn Fn(u64) -> T>>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prefix() {
let mut namer = Namer::with_prefix("t");
assert_eq!(namer.make_name(), "t1");
assert_eq!(namer.make_name(), "t2");
}
#[test]
fn suffix() {
let mut namer = Namer::with_suffix("t");
assert_eq!(namer.make_name(), "1t");
assert_eq!(namer.make_name(), "2t");
}
#[test]
fn alphabetic() {
let mut namer = Namer::alphabetic();
assert_eq!(namer.make_name(), "a");
assert_eq!(namer.make_name(), "b");
(0..25).for_each(|_| {
namer.make_name();
});
assert_eq!(namer.make_name(), "b2");
}
#[test]
fn custom_callback() {
let mut namer = Namer::new(|n| n + 1);
assert_eq!(namer.make_name(), 2);
assert_eq!(namer.make_name(), 3);
}
}