This document outlines all API calls made to cross-tables.com (scrabbleplayers.org) and how that data is used throughout the application.
We fetch three types of data from Cross-Tables to power our overlays:
| Data | Purpose | Overlay |
|---|
| // 07_round4_pairings | |
| // Generated: 2025-10-13T12:53:07.071Z | |
| newt = { | |
| "config": { | |
| "event_name": "Tournament (3 Divisions)", | |
| "event_date": "October 13, 2025", | |
| "max_rounds": 7 | |
| }, | |
| "divisions": [ |
| # ============================================================================= | |
| # ZSH CONFIGURATION | |
| # ============================================================================= | |
| # ============================================================================= | |
| # HISTORY CONFIGURATION | |
| # ============================================================================= | |
| # Unlimited history | |
| export HISTSIZE=1000000000 |
| #!/usr/bin/env zsh | |
| # ============================================================================= | |
| # TERMINAL LOGGING SYSTEM | |
| # ============================================================================= | |
| # Complete logging management for iTerm2 sessions | |
| # Source this from your .zshrc with: source ~/.terminal_logging_rc | |
| # ============================================================================= | |
| # CONFIGURATION | |
| # ============================================================================= |
| import Control.Monad.RWS.Lazy | |
| data Action = Fail | Proceed | |
| data Command = Command1 | Command2 | |
| newtype MyState = MyState Int | |
| -- step function that might do some IO while processing Commands | |
| -- such as going to the database before producing an Action and the next State | |
| stepM :: Monad m => MyState -> Command -> m (Action, Maybe MyState) | |
| stepM = undefined |
| class Monad m => FilesDb m where | |
| insertFile :: DbTeamId -> DbFolderId -> Text -> m (Entity DbFile) | |
| insertFolder :: DbTeamId -> DbFolderId -> Text -> m (Key DbFolder) | |
| getRootFolder :: DbTeamId -> m (Maybe (Folder (Entity DbFile))) | |
| getFile :: DbFileId -> m (Maybe (Entity DbFile)) | |
| -- | Purposely doesn't fetch the children, because we don't want to use recursion right now. | |
| getFolder :: DbFolderId -> m (Maybe (Folder (Entity DbFile))) | |
| getFolderRecursive :: DbFolderId -> m (Maybe (Folder (Entity DbFile))) | |
| deleteFile :: DbFileId -> m () | |
| deleteFolder :: DbFolderId -> m () |
| path :: [Text] -> Traversal' Value Value | |
| path = alaf Endo foldMap key | |
| • Couldn't match type ‘Maybe Value’ with ‘Value’ | |
| Expected type: [Text] -> (Value -> f Value) -> Value -> f Value | |
| Actual type: [Text] | |
| -> Unwrapped (Endo (Maybe Value -> f (Maybe Value))) | |
| • In the expression: alaf Endo foldMap key | |
| In an equation for ‘path’: path = alaf Endo foldMap key | |
| | |
| { | |
| "0": ["BB","BB","BB","BB"], | |
| "1": ["BB","BB","BB","BM"], | |
| "2": ["BB","BB","BB","F"], | |
| "3": ["BB","BB","BB","RM"], | |
| "4": ["BB","BB","BB","T"], | |
| "5": ["BB","BB","BB","WM"], | |
| "6": ["BB","BB","BM","BM"], | |
| "7": ["BB","BB","BM","F"], | |
| "8": ["BB","BB","BM","RM"], |
| Prelude> import Data.List | |
| Prelude Data.List> let classes = ["WM", "BM", "RM", "F", "T", "N"] | |
| Prelude Data.List> sort . nub . fmap sort $ do {a<-classes; b<-classes; c<-classes; d<-classes; return [a,b,c,d]} | |
| [["BM","BM","BM","BM"],["BM","BM","BM","F"],["BM","BM","BM","N"],["BM","BM","BM","RM"],["BM","BM","BM","T"],["BM","BM","BM","WM"],["BM","BM","F","F"],["BM","BM","F","N"],["BM","BM","F","RM"],["BM","BM","F","T"],["BM","BM","F","WM"],["BM","BM","N","N"],["BM","BM","N","RM"],["BM","BM","N","T"],["BM","BM","N","WM"],["BM","BM","RM","RM"],["BM","BM","RM","T"],["BM","BM","RM","WM"],["BM","BM","T","T"],["BM","BM","T","WM"],["BM","BM","WM","WM"],["BM","F","F","F"],["BM","F","F","N"],["BM","F","F","RM"],["BM","F","F","T"],["BM","F","F","WM"],["BM","F","N","N"],["BM","F","N","RM"],["BM","F","N","T"],["BM","F","N","WM"],["BM","F","RM","RM"],["BM","F","RM","T"],["BM","F","RM","WM"],["BM","F","T","T"],["BM","F","T","WM"],["BM","F","WM","WM"],["BM","N","N","N"],["BM","N","N","RM"],["BM","N","N","T"],["BM","N","N","WM"], |
| object JNumber { | |
| def apply(value: BigDecimal): JNumber = JNumber(value.toString) | |
| def apply(value: BigInt): JNumber = JNumber(value.toString) | |
| def apply(value: Byte): JNumber = JNumber(value.toString) | |
| def apply(value: Double): JNumber = JNumber(value.toString) | |
| def apply(value: Float): JNumber = JNumber(value.toString) | |
| def apply(value: Int): JNumber = JNumber(value.toInt.toString) | |
| def apply(value: Integer): JNumber = JNumber(value.toString) | |
| def apply(value: Long): JNumber = JNumber(value.toString) |