# Hack Standard Library (HSL)

## 概要

Hack Standard LibraryはHackプログラマー向けに一貫性があり、集中管理された、型安全なAPIセットを提供するライブラリです。特にHack配列（`vec`、`keyset`、`dict`）を扱う際に有用です。

**注意**: 2021年5月以降、HSLはHHVMとタイプチェッカーに組み込まれるよう移行中です。このリポジトリは主にテストコードを含んでいます。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| Vec操作 | vec型コレクションの結合、変換、選択、順序付け、分割などの操作 |
| Dict操作 | dict型コレクションの変換、結合、選択、順序付け、イントロスペクションなどの操作 |
| Keyset操作 | keyset型コレクションの変換、結合、選択、順序付けなどの操作 |
| Str操作 | 文字列の変換、選択、分割、結合、フォーマット、イントロスペクションなどの操作 |
| Math操作 | 数学的な計算、比較、定数、コンテナ操作 |
| C (Container)操作 | コンテナに対する順序付け、イントロスペクション、選択、リダクション操作 |
| Regex操作 | 正規表現によるパターンマッチングと例外処理 |
| Random | 乱数生成（SecureRandom、PseudoRandom） |
| File I/O | ファイルハンドル、一時ファイル、ロック機構などのファイル操作 |
| I/O | 読み取り/書き込みハンドル、バッファリング、パイプ、標準入出力などのI/O操作 |
| Network | TCP/UNIXソケット通信、サーバー、クライアント接続 |
| OS操作 | プロセススポーン、一時ディレクトリ作成などのOS機能 |
| Async | 非同期プログラミング（Semaphore、Poll、Condition）サポート |
| Locale | ロケール関連の操作とカテゴリ管理 |

## 技術スタック

### コア

- 言語: Hack
- ランタイム: HHVM (nightly)
- 型チェッカー: hh_client
- ライセンス: MIT

### 主要ライブラリ

- 標準のHack/HHVM ビルトイン機能
- PHPUnit互換テストフレームワーク（minitest）
- Watchman（ファイル監視）

## ディレクトリ構成

```
hsl-main/
├── src/                    # ソースコード
│   ├── async/              # 非同期プログラミングサポート
│   ├── c/                  # コンテナ操作
│   ├── dict/               # dict型操作
│   ├── file/               # ファイルI/O
│   ├── io/                 # 入出力操作
│   ├── keyset/             # keyset型操作
│   ├── legacy_fixme/       # レガシーコード互換性
│   ├── locale/             # ロケール操作
│   ├── math/               # 数学関数
│   ├── network/            # ネットワーク操作
│   ├── os/                 # OS機能
│   ├── random/             # 乱数生成
│   ├── regex/              # 正規表現
│   ├── str/                # 文字列操作
│   ├── tcp/                # TCP通信
│   ├── unix/               # UNIXソケット
│   └── vec/                # vec型操作
├── tests/                  # テストコード
│   ├── async/              # 非同期テスト
│   ├── c/                  # コンテナ操作テスト
│   ├── dict/               # dict操作テスト
│   ├── file/               # ファイルI/Oテスト
│   ├── io/                 # I/Oテスト
│   ├── keyset/             # keyset操作テスト
│   ├── legacy_fixme/       # レガシーコードテスト
│   ├── locale/             # ロケールテスト
│   ├── math/               # 数学関数テスト
│   ├── os/                 # OS機能テスト
│   ├── random/             # 乱数テスト
│   ├── regex/              # 正規表現テスト
│   ├── str/                # 文字列操作テスト
│   ├── tcp/                # TCP通信テスト
│   ├── unix/               # UNIXソケットテスト
│   └── vec/                # vec操作テスト
├── minitest/               # 軽量テストフレームワーク
├── .devcontainer/          # 開発コンテナ設定
└── .github/workflows/      # CI/CD設定
```

## セットアップ

### 必要条件

- HHVM（nightlyバージョン推奨）
- Watchman（ファイル監視用）
- ロケールサポート（en_US, fr_FR, tr_TR, da_DK）

### 開発環境の構築

#### DevContainerを使用する場合

VS Codeの「Remote - Containers」拡張機能を使用して、`.devcontainer/devcontainer.json`で定義された環境で開発できます。

```bash
# DevContainerは以下を自動的にセットアップします:
# - hhvm/hhvm:nightly イメージ
# - Watchman
# - 必要なロケール（en, fr, tr, da）
```

#### 手動セットアップ

```bash
# HHVMのインストール（Ubuntu）
apt-get update && apt-get install -y hhvm

# Watchmanのインストール
apt-get install -y watchman

# ロケールのインストール
apt-get install -y locales
locale-gen en_US en_US.UTF-8 fr_FR fr_FR.UTF-8 tr_TR tr_TR.UTF-8 da_DK da_DK.UTF-8
```

## 開発

### 型チェック

```bash
hh_client
```

### テストの実行

```bash
./minitest.sh
```

### CI/CD

GitHub Actionsにより、push/pull requestおよび毎日のスケジュールでビルドとテストが自動実行されます。

### 貢献

HSL本体への貢献は、[HHVMリポジトリ](https://github.com/facebook/hhvm/)の`hphp/hsl`サブディレクトリに対して行ってください。
