Przejdź do treści
Biblioteka skilli
Programowanie · Budowanie i kod

scala-tokenizer-domain-model

/scala-tokenizer-domain-model

Pomaga implementować abstrakcje tokenizera w Scali 2.13: ADT Token i TokenType, cechy tokenizera, wzorzec builder i konwencje przetwarzania wsadowego.

Licencja
MIT
Ostatnia zmiana repozytorium
02.10.2026

Ocena i bezpieczeństwo

95/ 100Klasa: dobry
Format20 / 25
Frontmatter z nazwą i opisem, poprawna nazwa, opis do 1024 znaków, nazwa zgodna z folderem.
Odkrywalność25 / 25
Opis mówi, kiedy użyć skilla, ma sensowną długość i jest w 3. osobie.
Treść35 / 35
Co najmniej 150 słów i do 500 linii, nagłówki, listy kroków, przykłady albo kod.
Higiena15 / 15
Bez zaślepek typu TODO, bez ścieżek Windows, z licencją.
Ryzykobrak sygnałów w skanie
Pliki w paczce
1
Skrypty
0
Komentarze HTML
0
Adresy URL w SKILL.md
0
Przestarzałość

Brak sygnałów. Repozytorium zmienione 02.10.2026, bez odwołań do wycofanych modeli i API.

Licencja

MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.

Co robi i kiedy

Pomaga implementować abstrakcje tokenizera w Scali 2.13: ADT Token i TokenType, cechy tokenizera, wzorzec builder i konwencje przetwarzania wsadowego.

Oryginalny opis (EN)

Use when implementing tokenizer abstractions in Scala 2.13 — covers Token/TokenType ADTs, tokenizer traits, builder pattern, and batch processing conventions

Jak działa

  1. Core Data Types
  2. BaseTokenizer Trait
  3. Concrete Tokenizers
  4. Builder Pattern
  5. Top-Level Functions
  6. Idiomatic Scala Patterns for Tokenizers
  7. Error Handling in Tokenization
Sekcje z nagłówków SKILL.md, w oryginale · 223 linii, 665 słów
Podgląd SKILL.md
---
name: scala-tokenizer-domain-model
description: Use when implementing tokenizer abstractions in Scala 2.13 — covers Token/TokenType ADTs, tokenizer traits, builder pattern, and batch processing conventions
---

# Scala Tokenizer Domain Model

## Core Data Types

### TokenType ADT
```scala
sealed trait TokenType {
  def value: String
}
object TokenType {
  case object String   extends TokenType { val value = "string"   }
  case object Numeric  extends TokenType { val value = "numeric"  }
  case object Temporal extends TokenType { val value = "temporal" }
  case object Whitespace extends TokenType { val value = "whitespace" }
  case object Unknown  extends TokenType { val value = "unknown"  }

  // Lookup by string name
  def fromString(s: String): Option[TokenType] = s.toLowerCase match {
    case "string"     => Some(String)
    case "numeric"    => Some(Numeric)
    case "temporal"   => Some(Temporal)
    case "whitespace" => Some(Whitespace)
    case "unknown"    => Some(Unknown)
    case _            => None
  }
}
```

### Token Case Class
```scala
case class Token(
  value: String,
  tokenType: TokenType,
  metadata: Map[String, Any] = Map.empty
) {
  def withMetadata(key: String, v: Any): Token =
    copy(metadata = metadata + (key -> v))

  def withMetadata(pairs: (String, Any)*): Token =
    copy(metadata = metadata ++ pairs)
}
```

Key design: `copy()` enables immutable updates — never mutate the token.

## BaseTokenizer Trait

```scala
trait BaseTokenizer {
  /** Tokenize a single text input */
  def tokenize(text: String): List[Token]

  /** Tokenize a batch; default delegates to tokenize per element */
  def tokenizeBatch(texts: Seq[String]): List[List[Token]] =
    texts.toList.map(tokenize)
}
```

## Concrete Tokenizers

### StringTokenizer
```scala
class StringTokenizer(
  lowercase: Boolean = false,
  stripPunctuation: Boolean = false
) extends BaseTokenizer {

  override def tokenize(text: String): List[Token] = {
    val processed = if (lowercase) text.toLowerCase else text
    val cleaned   = if (stripPunctuation) processed.replaceAll("[^\\w\\s]", "") else processed
    cleaned.split("\\s+")
      .filter(_.nonEmpty)
      .map(w => Token(w, TokenType.String))
      .toList
  }
}
```

### NumericTokenizer
```scala
class NumericTokenizer extends BaseTokenizer {
  private val numericPattern = """-?\d+(\.\d+)?""".r

  override def tokenize(text: String): List[Token] =
    numericPattern.findAllIn(text).toList
      .map(n => Token(n, TokenType.Numeric))
}
```

### TemporalTokenizer
Uses regex to find dates/times:
```scala
class TemporalTokenizer extends BaseTokenizer {
  private val datePattern =
    """\d{4}-\d{2}-\d{2}|\d{2}/\d{2}/\d{4}""".r

  override def tokenize(text: String): List[Token] =
    datePattern.findAllIn(text).toList
      .map(d => Token(d, TokenType.Temporal))
}
```

### WhitespaceTokenizer
```scala
class WhitespaceTokenizer extends BaseTokenizer {
  override def tokenize(text: String): List[Token] =
    text.split("\\s+")
      .filter(_.nonEmpty)
      .map(w => Token(w, TokenType.Whitespace))
      .toList
}
```

### UniversalTokenizer
Delegates to multiple tokenizers and merges/deduplicates:
```scala
class UniversalTokenizer(tokenizers: List[BaseTokenizer]) extends BaseTokenizer {
  override def tokenize(text: String): List[Token] =
    tokenizers.flatMap(_.tokenize(text))
}
```

## Builder Pattern

```scala
class TokenizerBuilder {
  private var tokenizers: List[BaseTokenizer] = List.empty

  def withStringTokenizer(
    lowercase: Boolean = false,
    stripPunctuation: Boolean = false
  ): TokenizerBuilder = {
    tokenizers = tokenizers :+ new StringTokenizer(lowercase, stripPunctuation)
    this
  }

  def withNumericTokenizer(): TokenizerBuilder = {
    tokenizers = tokenizers :+ new NumericTokenizer()
    this
  }

  def withTemporalTokenizer(): TokenizerBuilder = {
    tokenizers = tokenizers :+ new TemporalTokenizer()
    this
  }

  def withWhitespaceTokenizer(): TokenizerBuilder = {
    tokenizers = tokenizers :+ new WhitespaceTokenizer()
    this
  }

  def build(): UniversalTokenizer = new UniversalTokenizer(tokenizers)
}

object TokenizerBuilder {
  def apply(): TokenizerBuilder = new TokenizerBuilder()
}
```

## Top-Level Functions

These are placed in a package object or standalone object:

```scala
object Tokenizer {
  /** Tokenize a single text with the given tokenizer */
  def tokenize(text: String, tokenizer: BaseTokenizer): List[Token] =
    tokenizer.tokenize(text)

  /** Batch tokenize */
  def tokenizeBatch(
    texts: Seq[String],
    tokenizer: BaseTokenizer
  ): List[List[Token]] =
    tokenizer.tokenizeBatch(texts)

  /** Convert a raw string to a Token with inferred type */
  def toToken(value: String, tokenType: TokenType): Token =
    Token(value, tokenType)

  /** Add metadata to a token */
  def withMetadata(token: Token, key: String, v: Any): Token =
    token.withMetadata(key, v)
}
```

## Idiomatic Scala Patterns for Tokenizers

### Use `Regex` from `scala.util.matching`
```scala
import scala.util.matching.Regex
val pattern: Regex = """\d+""".r
pattern.findAllIn(text).toList
```

### Avoid `null` — use `Option`
```scala
def safeTokenize(text: String): Option[List[Token]] =
  Option(text).filter(_.nonEmpty).map(tokenize)
```

### Use `flatMap` / `collect` for filtering-with-transform
```scala
tokens.collect { case t if t.tokenType == TokenType.Numeric => t.value }
```

### Immutability by Default
- All `Token` fields are `val` (enforced by `case class`)  
- Builder accumulates with `:+` and returns `this` for chaining  
- `copy()` for "modification"

## Error Handling in Tokenization

```scala
import scala.util.{Try, Success, Failure}

def safeParse(text: String): Try[List[Token]] =
  Try(tokenize(text)).recoverWith {
    case e: IllegalArgumentException =>
      Failure(new RuntimeException(s"Bad input: $text", e))
  }
```

Wersje

W bazie nie ma innych skilli o nazwie scala-tokenizer-domain-model.

Migawka bazy z 28.10.2026 · wersja paczki 7baf17f175f6 (skrót SHA-256 całej paczki)

Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.

Podobne skille

  • 95scala-tokenizer-implementation-guide
    Podaje strategię implementacji, idiomy Scali i przebieg kompilacji do napisania pliku Tokenizer.scala przy tłumaczeniu tokenizera z Pythona na Scalę 2.13.
  • 95scala-tokenizer-patterns
    Podaje wzorce Scali dla implementacji tokenizerów: builder z generykami, JSON z circe, typy czasowe LocalDate i LocalDateTime oraz funkcyjne potoki tokenizacji.
  • 90vibe-types:scala
    Podpowiada techniki kontroli typów w Scali 3: typy nieprzezroczyste, ADT, givens, typy dopasowań i wzorce przeniesione z Rust, Pythona lub Haskella.
  • 90lower-anthropic-bill
    Audytuje wywołania API Anthropic, strukturę cache i ryzyko tokenizera, by obniżyć koszty Claude przed zmianą kodu.
  • 96scala
    Wspiera programowanie w Scali: programowanie funkcyjne, Akka, Play oraz Spark przy pracy z dużymi danymi.
  • 100python-scala-idioms
    Pomaga pisać idiomatyczny Scala przy tłumaczeniu z Python: niemutowalność, styl oparty na wyrażeniach, sealed hierarchies i konwencje Scala.

Uwagi i zgłoszenia

Wiadomość trafi do Bartosza Sokolińskiego. Adres e-mail jest potrzebny tylko do odpowiedzi. Szczegóły w polityce prywatności.