Primitive Types
- i8, i32, i64, i128
 - u8, u32, u64, u128
 - f32, f64
 - char
 
Built-in Types
- String
 - Vec<T>
 - Map<K, V>
 - Set<T>
 
Comments
// single comment のみDefine
// マーカー型
# Created
// Record Type
# User
  id: UserId
  name: Name
// newtype
# UserId: u64
// 関数
# fn a: i32, b: i32, c: i32 -> i32
  a * b * c
# Yes<T>: T
# No<T>: T
# It<T, E> :any Yes, No
# GetUser -> :any User, NotFound, Critical
it = get-user |> !
? it
  :is User user => user
  :is NotFound => _
  :is Critical cause => log cause |> !
# DatabaseResult :any Disconnected, SyntaxError
# Query sql: SQL -> DatabaseResult
# GetUser id: UserId -> :any User, DatabaseResult
# GetUserResult :is $.type:return GetUser
# Publish<T> message: T -> Void
# Subscribe<T> fn: i(message: T -> Void) -> Void
:pub
:GetUser
:resolve Query, At.building, './select-user.sql'
get-user q: Query, id: UserId ->
  q id |> !Module
// 全体に公開
:share .all
# Model
// 自分が配置されているdir以下に公開
:share .tree
# Model
// 自分が配置されているdirのみに公開
:share .here
# Model
// import
@ ./model
  Model
// lib
@ std/file
  File
// path alias
@ ~/repositories/user
  UserString
// primitive は char のみ
a: char = 'a'
// String と文字列操作はstd libからimportする
@std/string
  String
  replace
  pad-start
  pad-end
  repeat
  length
  
a: char[4] = 'aaaa'
a: String = String:from 'aaaaa' |> !
replaced = replace /a/g, 'b' a |> !
// bbbbb
replaced = replace 'a', 'b' a |> !
// bbbbbFunction
// カリー
// a, b を束縛
f = f 1, 2
// 残りの引数を入れた後実行
f 3 |> !
:pub
# Vec<T>
:pub
:for Vec<T>
# With xs: Vec<T>, x: T -> Vec<T>
:pub
:for Vec<T>
# RemoveAt xs: Vec<T>, index: u64 -> Vec<T>
:pub
:for Vec<T>
// 無名関数内の引数名を省略できないようにする
# Map<T, U> transform: (x: T -> U), xs: Vec<T> -> Vec<U>
:pub
# GetUser select: Select, id: UserId -> :any
  User
  UserNotFound
  TooManyResults
  GiveUp
:pub
:async
get-user: GetUser select, id ->
  'select * from users where id = {id}'
    |> sanitize
    |> select
    |> :await
    |> :match 
      :is Empty => UserNotFound id |> !
      :is One found => User:from found |> !
      :is Many results => TooManyResults:from results |> !
      :else cause => GiveUp:from cause |> !
    |> !
a: i32 = 0
a: i32:r = 0
a: i32:w = 0
a: i32:r:w = 0
# File
:pub
:for File
# Open path: PathLike, mode: Mode -> File
:for File
:when .linux
open path, mode ->
  // epoll使う
:for File
:when .windows
open path, mode ->
  // IOCP使う
:pub
# Add a: u32, b: u32 -> :any u32, OverFlow
:pub
:test 'limit', t ->
  limit: u32 = upper-limit<u32>!
  result = add limit, 10 |> !
  ? result
    :is OverFlow => t:ok!
    :else v => t:err v |> !
add: Add a, b ->
  sum = a + b
  ? sum
    :in 0..upper-limit<u32>! => sum
    :else => OverFlow:from '{a}, {b}'