Abstract class for manipulation of sequences of characters

Introduced classes

abstract class Buffer

core :: Buffer

A mutable sequence of characters.
class CachedAlphaComparator

core :: CachedAlphaComparator

Comparator that efficienlty use to_s to compare things
abstract class FlatText

core :: FlatText

All kinds of array-based text representations.
abstract class String

core :: String

Immutable sequence of characters.
abstract class Text

core :: Text

High-level abstraction for all text representations

Redefined classes

redef enum Bool

core :: abstract_text $ Bool

Native Booleans.
redef enum Byte

core :: abstract_text $ Byte

Native bytes.
redef extern class CString

core :: abstract_text $ CString

C string char *
redef enum Char

core :: abstract_text $ Char

Native characters.
redef interface Collection[E: nullable Object]

core :: abstract_text $ Collection

The root of the collection hierarchy.
redef enum Float

core :: abstract_text $ Float

Native floating point numbers.
redef enum Int

core :: abstract_text $ Int

Native integer numbers.
redef interface Map[K: nullable Object, V: nullable Object]

core :: abstract_text $ Map

Maps are associative collections: key -> item.
redef enum NativeArray[E: nullable Object]

core :: abstract_text $ NativeArray

Native Nit array
redef interface Object

core :: abstract_text $ Object

The root of the class hierarchy.
redef class Sys

core :: abstract_text $ Sys

The main class of the program.

All class definitions

redef enum Bool

core :: abstract_text $ Bool

Native Booleans.
abstract class Buffer

core $ Buffer

A mutable sequence of characters.
redef enum Byte

core :: abstract_text $ Byte

Native bytes.
redef extern class CString

core :: abstract_text $ CString

C string char *
class CachedAlphaComparator

core $ CachedAlphaComparator

Comparator that efficienlty use to_s to compare things
redef enum Char

core :: abstract_text $ Char

Native characters.
redef interface Collection[E: nullable Object]

core :: abstract_text $ Collection

The root of the collection hierarchy.
abstract class FlatText

core $ FlatText

All kinds of array-based text representations.
redef enum Float

core :: abstract_text $ Float

Native floating point numbers.
redef enum Int

core :: abstract_text $ Int

Native integer numbers.
redef interface Map[K: nullable Object, V: nullable Object]

core :: abstract_text $ Map

Maps are associative collections: key -> item.
redef enum NativeArray[E: nullable Object]

core :: abstract_text $ NativeArray

Native Nit array
redef interface Object

core :: abstract_text $ Object

The root of the class hierarchy.
abstract class String

core $ String

Immutable sequence of characters.
redef class Sys

core :: abstract_text $ Sys

The main class of the program.
abstract class Text

core $ Text

High-level abstraction for all text representations
package_diagram core::abstract_text abstract_text core::native native core::abstract_text->core::native core::math math core::native->core::math core::fixed_ints fixed_ints core::native->core::fixed_ints ...core::math ... ...core::math->core::math ...core::fixed_ints ... ...core::fixed_ints->core::fixed_ints core::flat flat core::flat->core::abstract_text core::string_search string_search core::string_search->core::abstract_text core::ropes ropes core::ropes->core::flat core::bytes bytes core::bytes->core::flat core::ropes... ... core::ropes...->core::ropes core::bytes... ... core::bytes...->core::bytes core::fixed_ints_text fixed_ints_text core::fixed_ints_text->core::string_search core::fixed_ints_text... ... core::fixed_ints_text...->core::fixed_ints_text

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module array

core :: array

This module introduces the standard array structure.
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module collection

core :: collection

This module define several collection classes.
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module range

core :: range

Module for range of discrete objects.
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure

Parents

module native

core :: native

Native structures for text and bytes

Children

module flat

core :: flat

All the array-based text representations

Descendants

module a_star

a_star :: a_star

A* pathfinding in graphs
module a_star-m

a_star-m

module abstract_tree

trees :: abstract_tree

Introduce tree structures abstraction
module activities

android :: activities

Android Activities wrapper
module actors

actors :: actors

Abstraction of the actors concepts
module agent_simulation

actors :: agent_simulation

a "Framework" to make Multi-Agent Simulations in Nit
module ai

ai :: ai

Simple toolkit for artificial intelligence.
module all

sdl2 :: all

Unites the main sdl2 module and its sister library sdl2::image
module android

android :: android

Android services and implementation of app.nit
module android19

gamnit :: android19

Variation using features from Android API 19
module angles

geometry :: angles

Angle related service using Float to represent an angle in radians
module api

github :: api

Nit object oriented interface to Github api.
module app

ios :: app

Basic structure for Nit apps on iOS
module app

app :: app

app.nit is a framework to create cross-platform applications
module app_base

app :: app_base

Base of the app.nit framework, defines App
module app_kit

cocoa :: app_kit

The Application Kit provides services to create GUI
module array_debug

array_debug :: array_debug

Exposes functions to help profile or debug Arrays.
module assets

android :: assets

Implementation of app::assets
module assets

ios :: assets

Implementation of app::assets
module assets

app :: assets

Portable services to load resources from the assets folder
module assets_and_resources

android :: assets_and_resources

Android Assets and Resources Management
module at_boot

android :: at_boot

Import this module to launch Service at device boot
module attributes

sax :: attributes

Interface for a list of XML attributes.
module attributes_impl

sax :: attributes_impl

Default implementation of the Attributes interface.
module audio

ios :: audio

iOS implementation of app::audio using AVAudioPlayer
module audio

app :: audio

Services to load and play Sound and Music from the assets folder
module audio

linux :: audio

app::audio implementation for GNU/Linux using SDL2 mixer
module audio

android :: audio

Android audio services, wraps a part of android audio API
module aware

android :: aware

Android compatibility module
module backtrack

ai :: backtrack

Basic framework for active backtrack solver
module base64

base64 :: base64

Offers the base 64 encoding and decoding algorithms
module basic_ciphers

crypto :: basic_ciphers

Basic cryptographic ciphers and utilities.
module bcm2835

bcm2835 :: bcm2835

Services to control the bcm2835 chipset used in the Raspberry Pi
module binary

binary :: binary

Read and write binary data with any Reader and Writer
module bintree

trees :: bintree

Binary Tree data-structure
module bitmap

bitmap :: bitmap

The Bitmap class represents a 24-bit bitmap image. An instance can be constructed
module bktree

trees :: bktree

Implementation of BKTree
module bmfont

gamnit :: bmfont

Parse Angel Code BMFont format and draw text
module bootstrap

html :: bootstrap

HTML templates for Bootstrap components.
module boxes

geometry :: boxes

Provides interfaces and classes to represent basic geometry needs.
module bucketed_game

bucketed_game :: bucketed_game

Game framework with an emphasis on efficient event coordination
module bundle

android :: bundle

A mapping class of String to various value types used by the
module bytes

crypto :: bytes

Mix of utilities and services related to bytes
module bytes

core :: bytes

Services for byte streams and arrays
module c

c :: c

Structures and services for compatibility with the C language
module cache

github :: cache

Enable caching on Github API accesses.
module caching

serialization :: caching

Services for caching serialization engines
module camera_control

gamnit :: camera_control

Simple camera control for user, as the method accept_scroll_and_zoom
module camera_control_android

gamnit :: camera_control_android

Two fingers camera manipulation, pinch to zoom and slide to scroll
module camera_control_linux

gamnit :: camera_control_linux

Mouse wheel and middle mouse button to control camera
module cameras

gamnit :: cameras

Camera services producing Model-View-Projection matrices
module cameras_cache

gamnit :: cameras_cache

Cache the Matrix produced by Camera::mvp_matrix
module cardboard

android :: cardboard

Services from the Google Cardboard SDK for virtual reality on Android
module cardboard

gamnit :: cardboard

Update the orientation of world_camera at each frame using the head position given by android::cardboard
module cartesian

cartesian :: cartesian

Memory-efficient Cartesian products on heterogeneous collections.
module chameneosredux

actors :: chameneosredux

Example implemented from "The computer Language Benchmarks Game" - Chameneos-Redux
module checker

dom :: checker

Simple XML validity checker using the dom module
module client

gamnit :: client

Client-side network services for games and such
module clusters

dot :: clusters

Example from http://www.graphviz.org/content/cluster
module cocoa

cocoa :: cocoa

Cocoa API, the development layer of OS X
module cocoa_extern_types

cocoa :: cocoa_extern_types

Test extern classes from the Cocoa framework and extern factories
module cocoa_message_box

cocoa :: cocoa_message_box

Simple message box using the Cocoa framework
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collections

java :: collections

Basic Java collections
module combinations

combinations :: combinations

Memory-efficient Cartesian products, combinations and permutation on collections.
module common

gamnit :: common

Services common to the client and server modules
module commonmark_gen

markdown2 :: commonmark_gen

Generate Nitunit tests from commonmark specification.
module concurrent_array_and_barrier

pthreads :: concurrent_array_and_barrier

A basic usage example of the modules pthreads and pthreads::cocurrent_collections
module concurrent_collections

pthreads :: concurrent_collections

Introduces thread-safe concurrent collections
module config

config :: config

Configuration options for nit tools and apps
module console

console :: console

Defines some ANSI Terminal Control Escape Sequences.
module content_handler

sax :: content_handler

Receives notification of the logical content of a document.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module counter

counter :: counter

Simple numerical statistical analysis and presentation
module cpp

cpp :: cpp

Services for compatibility with C++ code and libraries
module crapto

crapto :: crapto

Cryptographic attacks and utilities.
module crypto

crypto :: crypto

Mix of all things cryptography-related
module csv

csv :: csv

CSV document handling.
module curl

curl :: curl

Data transfer powered by the native curl library
module curl_http

curl :: curl_http

Example use of the Curl module
module curl_json

neo4j :: curl_json

cURL requests compatible with the JSON REST APIs.
module curl_rest

curl :: curl_rest

module curses

curses :: curses

Curses for Nit
module custom_serialization

serialization :: custom_serialization

Example of an ad hoc serializer that is tailored to transform business specific objects into customized representation.
module dalvik

android :: dalvik

Java related services specific to Android and its Dalvik VM
module data_store

ios :: data_store

Implements app::data_store using NSUserDefaults
module data_store

app :: data_store

Key/value storage services
module data_store

linux :: data_store

app::data_store implementation on GNU/Linux
module data_store

android :: data_store

Implements app::data_store using shared_preferences
module date

date :: date

Services to manipulate Date, Time and DateTime
module decl_handler

sax :: decl_handler

SAX2 extension handler for DTD declaration events.
module decorators

markdown :: decorators

Decorators for markdown parsing.
module depth

gamnit :: depth

Framework for 3D games in Nit
module depth_core

gamnit :: depth_core

Base entities of the depth 3D game framework
module deriving

deriving :: deriving

Automatic derivable implementations of standard basic methods.
module digraph

graph :: digraph

Implementation of directed graphs, also called digraphs.
module display

gamnit :: display

Abstract display services
module display_android

gamnit :: display_android

Gamnit display implementation for Android
module display_ios

gamnit :: display_ios

Gamnit display implementation for iOS
module display_linux

gamnit :: display_linux

Gamnit display implementation for GNU/Linux using egl, sdl and x11
module dom

dom :: dom

Easy XML DOM parser
module dot

dot :: dot

Dot rendering library
module drop_privileges

privileges :: drop_privileges

Example using the privileges module to drop privileges from root
module dtd_handler

sax :: dtd_handler

Receives notification of basic DTD-related events.
module dynamic

json :: dynamic

Dynamic interface to read values from JSON strings
module dynamic_resolution

gamnit :: dynamic_resolution

Virtual screen with a resolution independent from the real screen
module egl

egl :: egl

Interface between rendering APIs (OpenGL, OpenGL ES, etc.) and the native windowing system.
module egl

gamnit :: egl

Use of EGL to implement Gamnit on GNU/Linux and Android
module emscripten

emscripten :: emscripten

Platform for the emscripten framework
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module english_utils

crapto :: english_utils

English language utilities for cryptographic purposes.
module entity_resolver

sax :: entity_resolver

Basic interface for resolving entities.
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module error

json :: error

Intro JsonParseError which is exposed by all JSON reading APIs
module error

neo4j :: error

Errors thrown by the neo4j library.
module error_handler

sax :: error_handler

Basic interface for SAX error handlers.
module event_queue

event_queue :: event_queue

Register, update and discard events in a timeline.
module events

github :: events

Events are emitted by Github Hooks.
module events

sdl2 :: events

SDL 2 events and related services
module example_angular

popcorn :: example_angular

This is an example of how to use angular.js with popcorn
module example_vsm

vsm :: example_vsm

Example using a FileIndex
module exec

core :: exec

Invocation and management of operating system sub-processes.
module ext

sax :: ext

Interfaces to optional SAX2 handlers.
module ext

msgpack :: ext

Application specific MessagePack extension MsgPackExt
module ext

posix :: ext

Services not defined in POSIX but provided by most implementations
module extra

pthreads :: extra

Offers some POSIX threads services that are not available on all platforms
module extra

curl :: extra

Shortcut services for scripts: http_get and http_download
module fannkuchredux

actors :: fannkuchredux

Example implemented from "The computer Language Benchmarks Game" - Fannkuch-Redux
module fca

fca :: fca

Formal Concept Analysis
module ffi_support

java :: ffi_support

Core supporting services for the FFI with Java
module file

core :: file

File manipulations (create, read, write, etc.)
module file_server

nitcorn :: file_server

Provides the FileServer action, which is a standard and minimal file server
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

gamnit :: flat

Simple API for 2D games, built around Sprite and App::update
module flat_core

gamnit :: flat_core

Core services for the flat API for 2D games
module font

gamnit :: font

Abstract font drawing services, implemented by bmfont and tileset
module for_abuse

for_abuse :: for_abuse

Service management through the for control structure.
module foundation

cocoa :: foundation

The Foundation Kit provides basic Objective-C classes and structures
module functional

functional :: functional

Functional types and functional API for Iterator
module functional_gen

functional :: functional_gen

This module is only used to generate functional_types.nit
module functional_types

functional :: functional_types

This module provides functional type to represents various function forms.
module game

android :: game

Android services and implementation of app.nit for gamnit and mnit
module gamepad

android :: gamepad

Support for gamepad events (over Bluetooth or USB)
module gamnit

gamnit :: gamnit

Game and multimedia framework for Nit
module gamnit_android

gamnit :: gamnit_android

Support services for Gamnit on Android
module gamnit_ios

gamnit :: gamnit_ios

Support services for gamnit on iOS
module gamnit_linux

gamnit :: gamnit_linux

Support services for Gamnit on GNU/Linux
module gdk

gtk :: gdk

Services from GDK
module gdk_enums

gtk :: gdk_enums

module gen_nit

gen_nit :: gen_nit

Support to generate and otherwise manipulate Nit code
module geometry

geometry :: geometry

Provides interfaces and classes to represent basic geometry needs.
module gettext

gettext :: gettext

Internationalization of Strings using gettext library
module github

github :: github

Nit wrapper for Github API
module glesv2

glesv2 :: glesv2

OpenGL graphics rendering library for embedded systems, version 2.0
module glkit

ios :: glkit

GLKit services to create an OpenGL ES context on iOS
module gmp

gmp :: gmp

Multi precision integer and rational number using gmp lib
module graph

neo4j :: graph

Provides an interface for services on a Neo4j graphs.
module gtk

gtk :: gtk

GTK+ widgets and services
module gtk_core

gtk :: gtk_core

Classes and services to use libGTK widgets
module gtk_enums

gtk :: gtk_enums

module hash_debug

hash_debug :: hash_debug

Inject behavior analysis to hash-collections (HashMap, HashSet, etc.)
module hello

dot :: hello

Example from http://www.graphviz.org/content/hello
module hello_cocoa

cocoa :: hello_cocoa

Hello world using the Cocoa framework
module hello_ios

ios :: hello_ios

Simple iOS app with a single label
module helpers

sax :: helpers

Contains "helper" classes, including support for bootstrapping SAX-based applications.
module hooks

github :: hooks

Github hook event listening with nitcorn.
module htcpcp_server

nitcorn :: htcpcp_server

A server that implements HTCPCP. At the moment there are no additions.
module html

html :: html

HTML output facilities
module html_page

html :: html_page

module http_errors

nitcorn :: http_errors

Offers ErrorTemplate to display error pages
module http_request

app :: http_request

HTTP request services: AsyncHttpRequest and Text::http_get
module http_request

linux :: http_request

Implementation of app::http_request using GDK and Curl
module http_request

nitcorn :: http_request

Provides the HttpRequest class and services to create it
module http_request

android :: http_request

Android implementation of app:http_request
module http_request

ios :: http_request

Implementation of app::http_request for iOS
module http_request_buffer

nitcorn :: http_request_buffer

Http request parsing for buffered inputs.
module http_request_example

app :: http_request_example

Example for the app::http_request main service AsyncHttpRequest
module http_response

nitcorn :: http_response

Provides the HttpResponse class and http_status_codes
module image

sdl2 :: image

Services of the SDL_image 2.0 library
module ini

ini :: ini

Read and write INI configuration files
module input

bcm2835 :: input

module input

mnit :: input

Defines abstract classes for user and general inputs to the application.
module input_events

android :: input_events

Pointer and hardware key events
module input_ios

gamnit :: input_ios

Gamnit event support for iOS
module input_source

sax :: input_source

A single input source for an XML entity.
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module intent

android :: intent

Services allowing to launch activities and start/stop services using
module intent_api10

android :: intent_api10

Services allowing to launch activities and start/stop services using
module intent_api11

android :: intent_api11

Refines intent module to add API 11 services
module intent_api12

android :: intent_api12

Refines intent module to add API 12 services
module intent_api14

android :: intent_api14

Refines intent module to add API 14 services
module intent_api15

android :: intent_api15

Refines intent module to add API 15 services
module intent_api16

android :: intent_api16

Refines intent module to add API 16 services
module intent_api17

android :: intent_api17

Refines intent module to add API 17 services
module intent_api18

android :: intent_api18

Refines intent module to add API 18 services
module intent_api19

android :: intent_api19

Refines intent module to add API 19 services
module io

java :: io

Services from the java.io package
module ios

ios :: ios

iOS platform support
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module iter_extras

functional :: iter_extras

This modules provides a new functional interface for Iterator.
module java

java :: java

Supporting services for the FFI with Java and to access Java libraries
module jointask_example

pthreads :: jointask_example

Simple example of joinable task using threadpool
module json

json :: json

Read and write JSON formatted text using the standard serialization services
module json_graph_store

neo4j :: json_graph_store

Provides JSON as a mean to store graphs.
module jvm

jvm :: jvm

Java Virtual Machine invocation API and others services from the JNI C API
module keys

gamnit :: keys

Simple service keeping track of which keys are currently pressed
module landscape

android :: landscape

Lock the application in the landscape orientation
module landscape

gamnit :: landscape

Lock the application in the landscape orientation
module langannot

gettext :: langannot

Sample module showing the use of the i18n annotation
module lexer

saxophonit :: lexer

SAXophoNit’s lexer
module lexical_handler

sax :: lexical_handler

SAX2 extension handler for lexical events.
module lexpr

logic :: lexpr

Logical expression.
module libevent

libevent :: libevent

Low-level wrapper around the libevent library to manage events on file descriptors
module libevent_example

libevent :: libevent_example

Minimal usage example of libevent
module limit_fps

gamnit :: limit_fps

Frame-rate control for applications
module linux

linux :: linux

Implementation of app.nit for the Linux platform
module load_image

android :: load_image

Low-level services to load pixel data from the assets
module loader

github :: loader

module log

android :: log

Advanced Android logging services
module log

nitcorn :: log

Services inserting a timestamp in all prints and to log each requests
module logger

logger :: logger

A simple logger for Nit
module logic

logic :: logic

First-order logic data structure and algorithm.
module macro

template :: macro

String templating using macros.
module man

markdown :: man

Simple groff decorator restricted for manpages.
module mandelbrot

actors :: mandelbrot

Example implemented from "The computer Language Benchmarks Game" - Mandelbrot
module markdown

markdown :: markdown

Markdown parsing.
module markdown_ast

markdown2 :: markdown_ast

Markdown AST representation
module markdown_block_parsing

markdown2 :: markdown_block_parsing

Markdown blocks parsing
module markdown_github

markdown2 :: markdown_github

Markdown Github mode
module markdown_html_rendering

markdown2 :: markdown_html_rendering

HTML rendering of Markdown documents
module markdown_inline_parsing

markdown2 :: markdown_inline_parsing

Parser for inline markdown
module markdown_latex_rendering

markdown2 :: markdown_latex_rendering

LaTeX rendering of Markdown documents
module markdown_man_rendering

markdown2 :: markdown_man_rendering

Manpages rendering of Markdown documents
module markdown_md_rendering

markdown2 :: markdown_md_rendering

Markdown rendering of Markdown documents
module markdown_rendering

markdown2 :: markdown_rendering

Markdown document rendering
module matrix

matrix :: matrix

Services for matrices of Float values
module md5

md5 :: md5

Native MD5 digest implementation as Text::md5
module media_types

nitcorn :: media_types

Services to identify Internet media types (or MIME types, Content-types)
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module minimal

sdl2 :: minimal

An example to test and demonstrate the sdl2 lib with image and events
module mixer

sdl2 :: mixer

SDL2 mixer with sample/sounds and music
module model_dimensions

gamnit :: model_dimensions

Dimensions related services for Model and Mesh
module model_parser_base

gamnit :: model_parser_base

Services to parse models from a text description
module mongodb

mongodb :: mongodb

MongoDB Nit Driver.
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module more_lights

gamnit :: more_lights

More implementations of Light
module more_materials

gamnit :: more_materials

Various material implementations
module more_meshes

gamnit :: more_meshes

More simple geometric meshes
module more_models

gamnit :: more_models

Services to load models from the assets folder
module mpd

mpd :: mpd

Music Player Daemon client library
module mpi

mpi :: mpi

Implementation of the Message Passing Interface protocol by wrapping OpenMPI
module msgpack

msgpack :: msgpack

MessagePack, an efficient binary serialization format
module msgpack_to_json

msgpack :: msgpack_to_json

Convert MessagePack format to JSON
module mtl

gamnit :: mtl

Services to parse .mtl material files
module namespace_support

sax :: namespace_support

Encapsulates Namespace logic for use by applications using SAX, or internally by SAX drivers.
module native_app_glue

android :: native_app_glue

Wrapper of the Android native_app_glue framework to implement app.nit
module native_curl

curl :: native_curl

Binding of C libCurl which allow us to interact with network.
module native_gmp

gmp :: native_gmp

Low-level GMP features
module native_mongodb

mongodb :: native_mongodb

Native wrapper for the MongoDB C Driver
module native_notification

android :: native_notification

Native Java classes for notifications
module native_postgres

postgresql :: native_postgres

A native wrapper ove the postgres c api
module native_sqlite3

sqlite3 :: native_sqlite3

Low-level Sqlite3 features
module native_ui

android :: native_ui

Native services from the android.view and android.widget namespaces
module neo4j

neo4j :: neo4j

Neo4j connector through its JSON REST API using curl.
module network

gamnit :: network

Easy client/server logic for games and simple distributed applications
module nit_activity

android :: nit_activity

Core implementation of app.nit on Android using a custom Java entry point
module nitcc_runtime

nitcc_runtime :: nitcc_runtime

Runtime library required by parsers and lexers generated by nitcc
module nitcorn

nitcorn :: nitcorn

The nitcorn Web server framework creates server-side Web apps in Nit
module nitcorn_hello_world

nitcorn :: nitcorn_hello_world

Hello World Web server example
module nitcorn_reverse_proxy

nitcorn :: nitcorn_reverse_proxy

Minimal example using a ProxyAction
module niti_runtime

niti_runtime :: niti_runtime

Runtime library to loop around the main program for each line in file-name arguments
module nitmd

markdown2 :: nitmd

A Markdown parser for Nit.
module nitmd

markdown :: nitmd

A Markdown parser for Nit.
module nlp

nlp :: nlp

Natural Language Processor based on the StanfordNLP core.
module nlp_index

nlp :: nlp_index

Example showing how to use a NLPFileIndex.
module noise

noise :: noise

Noise generators PerlinNoise and InterpolatedNoise
module notification

android :: notification

Services to show notification in the Android status bar
module numeric

core :: numeric

Advanced services for Numeric types
module obj

gamnit :: obj

Services to parse .obj geometry files
module opengles2_hello_triangle

glesv2 :: opengles2_hello_triangle

Basic example of OpenGL ES 2.0 usage using SDL 2
module opts

opts :: opts

Management of options on the command line
module ordered_tree

ordered_tree :: ordered_tree

Manipulation and presentation of ordered trees.
module pagerank

graph :: pagerank

Add PageRank computation for vertices in Digraph.
module parser

dom :: parser

XML DOM-parsing facilities
module parser_base

parser_base :: parser_base

Simple base for hand-made parsers of all kinds
module particles

gamnit :: particles

Particle effects
module perfect_hashing

perfect_hashing :: perfect_hashing

Perfect hashing and perfect numbering
module performance_analysis

performance_analysis :: performance_analysis

Services to gather information on the performance of events by categories
module pipeline

pipeline :: pipeline

Pipelined filters and operations on iterators.
module platform

android :: platform

Triggers compilation for the android platform
module platform

ios :: platform

Triggers compilation for the iOS platform
module points_and_lines

geometry :: points_and_lines

Interfaces and classes to represent basic geometry needs.
module polygon

geometry :: polygon

Convex Polygons manipulations
module pop_auth

popcorn :: pop_auth

Authentification handlers.
module pop_config

popcorn :: pop_config

Configuration file and options for Popcorn apps
module pop_handlers

popcorn :: pop_handlers

Route handlers.
module pop_json

popcorn :: pop_json

Introduce useful services for JSON REST API handlers.
module pop_repos

popcorn :: pop_repos

Repositories for data management.
module pop_routes

popcorn :: pop_routes

Internal routes representation.
module pop_sessions

popcorn :: pop_sessions

Session handlers
module pop_tasks

popcorn :: pop_tasks

Popcorn threaded tasks
module pop_templates

popcorn :: pop_templates

Template rendering for popcorn
module pop_tests

popcorn :: pop_tests

Popcorn testing services
module pop_validation

popcorn :: pop_validation

Quick and easy validation framework for Json inputs
module popcorn

popcorn :: popcorn

Application server abstraction on top of nitcorn.
module portrait

gamnit :: portrait

Lock the application in the portrait orientation
module portrait

android :: portrait

Config to set the portrait orientation
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module posix

posix :: posix

Services conforming to POSIX
module postgres

postgresql :: postgres

Services to manipulate a Postgres database
module privileges

privileges :: privileges

Process privileges management utilities
module programs

gamnit :: programs

Services for graphical programs with shaders, attributes and uniforms
module progression

progression :: progression

Event-based interface to track the progression of an operation.
module projection

matrix :: projection

Services on Matrix to transform and project 3D coordinates
module prompt

prompt :: prompt

Basic services to display a prompt
module protocol

core :: protocol

module proxy

nitcorn :: proxy

Provides the ProxyAction action, which redirects requests to another interface
module pthreads

nitcorn :: pthreads

Activate the use of pthreads with nitcorn
module pthreads

pthreads :: pthreads

Main POSIX threads support and intro the classes Thread, Mutex and Barrier
module puzzle

ai :: puzzle

The N-puzzle problem, modeled naively as a SearchProblem.
module quadtree

geometry :: quadtree

QuadTree API mostly used for 2 dimensional collision detection
module queens

ai :: queens

Example of the famous eight-queens problem solved with the ai::backtrack module.
module queries

mongodb :: queries

Mongo queries framework
module rbtree

trees :: rbtree

A red–black tree is a data structure which is a type of self-balancing binary search tree.
module re

core :: re

Regular expression support for all services based on Pattern
module reactor

nitcorn :: reactor

Core of the nitcorn project, provides HttpFactory and Action
module read

msgpack :: read

Low-level read MessagePack format from Reader streams
module reader_model

saxophonit :: reader_model

Reader’s model.
module readline

readline :: readline

GNU readline library wrapper
module realtime

realtime :: realtime

Services to keep time of the wall clock time
module redef_collections

pthreads :: redef_collections

Redef some basic collections to be thread-safe
module restful

nitcorn :: restful

Support module for the nitrestful tool and the restful annotation
module restful_annot

nitcorn :: restful_annot

Example for the restful annotation documented at lib/nitcorn/restful.nit
module ropes

core :: ropes

Tree-based representation of a String.
module ropes_debug

ropes_debug :: ropes_debug

Exposes methods for debugging ropes when needed.
module rubix

rubix :: rubix

Rubix-cube modelization library
module safe

serialization :: safe

Services for safer deserialization engines
module sax

sax :: sax

Core SAX APIs.
module sax_locator

sax :: sax_locator

Interface for associating a SAX event with a document location.
module sax_locator_impl

sax :: sax_locator_impl

Provides an optional convenience implementation of Locator.
module sax_parse_exception

sax :: sax_parse_exception

Encapsulates an XML parse error or warning.
module saxophonit

saxophonit :: saxophonit

A SAX 2 parser in Nit.
module scene2d

scene2d :: scene2d

Framework for 2D management of game elements
module sdl2

sdl2 :: sdl2

Simple DirectMedia Layer (SDL) 2.0 services for easy window creation and 2D drawing
module sdl2_base

sdl2 :: sdl2_base

Basic SDL 2 features
module search

ai :: search

Basic framework for search problems and solver.
module selection

gamnit :: selection

Select Actor from a screen coordinate
module sendmail

sendmail :: sendmail

Send emails using the sendmail program
module sensors

android :: sensors

Access Android sensors
module sequential_id

neo4j :: sequential_id

Provides a sequential identification scheme for Neo4j nodes.
module serialization

serialization :: serialization

General serialization services
module serialization_common

msgpack :: serialization_common

Serialization services for serialization_write and serialization_read
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module serialization_read

msgpack :: serialization_read

Deserialize full Nit objects from MessagePack format
module serialization_read

json :: serialization_read

Services to read JSON: deserialize_json and JsonDeserializer
module serialization_write

msgpack :: serialization_write

Serialize full Nit objects to MessagePack format
module serialization_write

json :: serialization_write

Services to write Nit objects to JSON strings: serialize_to_json and JsonSerializer
module server

gamnit :: server

Server-side network services for games and such
module server_config

nitcorn :: server_config

Classes and services to configure the server
module service

android :: service

Android service support for app.nit centered around the class Service
module sessions

nitcorn :: sessions

Automated session management
module sexp

sexp :: sexp

S-Expression parsing facilities
module sha1

sha1 :: sha1

Provides methods to compute the SHA1 hash of a String
module shadow

gamnit :: shadow

Shadow mapping using a depth texture
module shared_preferences

android :: shared_preferences

Services allowing to save and load datas to internal android device
module shared_preferences_api10

android :: shared_preferences_api10

Services to save/load data using android.content.SharedPreferences for the android platform
module shared_preferences_api11

android :: shared_preferences_api11

Refines shared_preferences module to add API 11 services
module show_basedir

xdg_basedir :: show_basedir

Prints the local base directories as per the XDG Base Directory specification
module signal_handler

nitcorn :: signal_handler

Handle SIGINT and SIGTERM to close the server after all active events
module signals

signals :: signals

ANSI C signal handling
module simple

actors :: simple

A very simple example of the actor model
module simple_file_server

nitcorn :: simple_file_server

Basic file server on port 80 by default, may require root to execute
module simple_simulation

actors :: simple_simulation

Using agent_simulation by refining the Agent class to make
module socket

socket :: socket

Socket services
module socket_c

socket :: socket_c

Low-level socket functionalities
module socket_client

socket :: socket_client

Client sample using the Socket module which connect to the server sample.
module socket_server

socket :: socket_server

Server sample using the Socket module which allow client to connect
module socket_simple_server

socket :: socket_simple_server

Simple server example using a non-blocking TCPServer
module sqlite3

sqlite3 :: sqlite3

Services to manipulate a Sqlite3 database
module standard

standard :: standard

Old module implicitly imported by the old compiler.
module stanford

nlp :: stanford

Natural Language Processor based on the StanfordNLP core.
module static

json :: static

Static interface to read Nit objects from JSON strings
module stereoscopic_view

gamnit :: stereoscopic_view

Refine EulerCamera and App::frame_core_draw to get a stereoscopic view
module store

json :: store

Store and load json data.
module stream

core :: stream

Input and output streams of characters
module symbol

symbol :: symbol

Library for simple interning of strings
module syswm

sdl2 :: syswm

Window manager related SDL 2 services
module template

template :: template

Basic template system
module test_markdown

markdown2 :: test_markdown

Test suites for module markdown
module testing

saxophonit :: testing

Various utilities to help testing SAXophoNit (and SAX parsers in general).
module text

core :: text

All the classes and methods related to the manipulation of text entities
module text_stat

text_stat :: text_stat

Injects stat-calculating functionalities to Text and its variants
module texture_atlas_parser

gamnit :: texture_atlas_parser

Tool to parse XML texture atlas and generated Nit code to access subtextures
module textures

gamnit :: textures

Load textures, create subtextures and manage their life-cycle
module thread_ring

actors :: thread_ring

Example implemented from "The computer Language Benchmarks Game" - Thread-Ring
module threaded_example

pthreads :: threaded_example

test for threaded annotation
module threadpool

pthreads :: threadpool

Introduces a minimal ThreadPool implementation using Tasks
module threadpool_example

pthreads :: threadpool_example

Simple example using threadpool
module tileset

gamnit :: tileset

Support for TileSet, TileSetFont and drawing text with TextSprites
module time

core :: time

Management of time and dates
module toast

android :: toast

Services to display a toast, a small popup on Android
module token

nitcorn :: token

Simple generate_token service, independent of the rest of the nitcorn framework
module trees

trees :: trees

General module for tree data structures
module trie

trees :: trie

A trie (or prefix tree) is a datastructure used to perform prefix searches.
module u16_string

core :: u16_string

Wrapper of ICU's UTF-16 encoded strings and conversion
module ui

android :: ui

Views and services to use the Android native user interface
module ui

ios :: ui

Implementation of app::ui for iOS
module ui

linux :: ui

Implementation of the app.nit UI module for GNU/Linux
module ui

app :: ui

Portable UI controls for mobiles apps
module ui_example

app :: ui_example

User interface example using app::ui
module ui_test

android :: ui_test

Test for app.nit's UI services
module uikit

ios :: uikit

File generated by objcwrapper
module undirected_clusters

dot :: undirected_clusters

Example from http://www.graphviz.org/Gallery/undirected/fdpclust.html
module utf8

core :: utf8

Codec for UTF-8 I/O
module v3_10

gtk :: v3_10

GTK+ services added at version 3.10
module v3_4

gtk :: v3_4

module v3_6

gtk :: v3_6

GTK+ services added at version 3.6
module v3_8

gtk :: v3_8

GTK+ services added at version 3.8
module vararg_routes

nitcorn :: vararg_routes

Routes with parameters.
module vibration

android :: vibration

Vibration services for Android
module virtual_gamepad

gamnit :: virtual_gamepad

Virtual gamepad mapped to keyboard keys for quick and dirty mobile support
module vr

gamnit :: vr

VR support for gamnit depth, for Android only
module vsm

vsm :: vsm

Vector Space Model
module wallet

github :: wallet

Github OAuth tokens management
module websocket

websocket :: websocket

Adds support for a websocket connection in Nit
module websocket_server

websocket :: websocket_server

Sample module for a minimal chat server using Websockets on port 8088
module wifi

android :: wifi

Simple wrapper of the Android WiFi services
module write

msgpack :: write

Low-level write in MessagePack format to Writer streams
module x11

x11 :: x11

Services from the X11 library
module xdg_basedir

xdg_basedir :: xdg_basedir

Services for using the XDG Base Directory specification
module xml_entities

dom :: xml_entities

Basic blocks for DOM-XML representation
module xml_filter

sax :: xml_filter

Interface for an XML filter.
module xml_filter_impl

sax :: xml_filter_impl

Base class for deriving an XML filter.
module xml_reader

sax :: xml_reader

Interface for reading an XML document using callbacks.
module xor

crapto :: xor

Cryptographic attacks and utilities for XOR-based algorithms.
module xor_ciphers

crypto :: xor_ciphers

XOR oriented cryptographic ciphers and utilities.
# Abstract class for manipulation of sequences of characters
module abstract_text

import native
import math
import collection
intrude import collection::array

in "C" `{
	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
`}

# High-level abstraction for all text representations
abstract class Text
	super Comparable
	super Cloneable

	redef type OTHER: Text

	# Type of self (used for factorization of several methods, ex : substring_from, empty...)
	type SELFTYPE: Text

	# Gets a view on the chars of the Text object
	#
	# ~~~
	# assert "hello".chars.to_a == ['h', 'e', 'l', 'l', 'o']
	# ~~~
	fun chars: SequenceRead[Char] is abstract

	# Gets a view on the bytes of the Text object
	#
	# ~~~
	# assert "hello".bytes.to_a == [104, 101, 108, 108, 111]
	# ~~~
	fun bytes: SequenceRead[Int] is abstract

	# Number of characters contained in self.
	#
	# ~~~
	# assert "12345".length == 5
	# assert "".length == 0
	# assert "あいうえお".length == 5
	# ~~~
	fun length: Int is abstract

	# Number of bytes in `self`
	#
	# ~~~
	# assert "12345".byte_length == 5
	# assert "あいうえお".byte_length == 15
	# ~~~
	fun byte_length: Int is abstract

	# Create a substring.
	#
	# ~~~
	# assert "abcd".substring(1, 2)      ==  "bc"
	# assert "abcd".substring(-1, 2)     ==  "a"
	# assert "abcd".substring(1, 0)      ==  ""
	# assert "abcd".substring(2, 5)      ==  "cd"
	# assert "あいうえお".substring(1,3) ==  "いうえ"
	# ~~~
	#
	# A `from` index < 0 will be replaced by 0.
	# Unless a `count` value is > 0 at the same time.
	# In this case, `from += count` and `count -= from`.
	fun substring(from: Int, count: Int): SELFTYPE is abstract

	# Iterates on the substrings of self if any
	private fun substrings: Iterator[FlatText] is abstract

	# Is the current Text empty (== "")
	#
	# ~~~
	# assert "".is_empty
	# assert not "foo".is_empty
	# ~~~
	fun is_empty: Bool do return self.length == 0

	# Returns an empty Text of the right type
	#
	# This method is used internally to get the right
	# implementation of an empty string.
	protected fun empty: SELFTYPE is abstract

	# Returns a copy of `self` as a Buffer
	fun to_buffer: Buffer is abstract

	# Gets the first char of the Text
	fun first: Char do return self.chars[0]

	# Access a character at `index` in the string.
	#
	# ~~~
	# assert "abcd"[2]         == 'c'
	# ~~~
	fun [](index: Int): Char do return self.chars[index]

	# Gets the index of the first occurence of 'c'
	#
	# Returns -1 if not found
	fun index_of(c: Char): Int
	do
		return index_of_from(c, 0)
	end

	# Gets the last char of self
	fun last: Char do return self.chars[length-1]

	# Gets the index of the first occurence of ´c´ starting from ´pos´
	#
	# Returns -1 if not found
	fun index_of_from(c: Char, pos: Int): Int
	do
		var iter = self.chars.iterator_from(pos)
		while iter.is_ok do
			if iter.item == c then return iter.index
			iter.next
		end
		return -1
	end

	# Gets the last index of char ´c´
	#
	# Returns -1 if not found
	fun last_index_of(c: Char): Int
	do
		return last_index_of_from(c, length - 1)
	end

	# Return a null terminated char *
	fun to_cstring: CString is abstract

	# The index of the last occurrence of an element starting from pos (in reverse order).
	#
	# ~~~
	# var s = "/etc/bin/test/test.nit"
	# assert s.last_index_of_from('/', s.length-1) == 13
	# assert s.last_index_of_from('/', 12)         == 8
	# ~~~
	#
	# Returns -1 if not found
	fun last_index_of_from(item: Char, pos: Int): Int do return chars.last_index_of_from(item, pos)

	# Concatenates `o` to `self`
	#
	# ~~~
	# assert "hello" + "world"  == "helloworld"
	# assert "" + "hello" + ""  == "hello"
	# ~~~
	fun +(o: Text): SELFTYPE is abstract

	# Gets an iterator on the chars of self
	fun iterator: Iterator[Char]
	do
		return self.chars.iterator
	end


	# Gets an Array containing the chars of self
	fun to_a: Array[Char] do return chars.to_a

	# Create a substring from `self` beginning at the `from` position
	#
	# ~~~
	# assert "abcd".substring_from(1)    ==  "bcd"
	# assert "abcd".substring_from(-1)   ==  "abcd"
	# assert "abcd".substring_from(2)    ==  "cd"
	# ~~~
	#
	# As with substring, a `from` index < 0 will be replaced by 0
	fun substring_from(from: Int): SELFTYPE
	do
		if from >= self.length then return empty
		if from < 0 then from = 0
		return substring(from, length - from)
	end

	# Does self have a substring `str` starting from position `pos`?
	#
	# ~~~
	# assert "abcd".has_substring("bc",1)	     ==  true
	# assert "abcd".has_substring("bc",2)	     ==  false
	# ~~~
	#
	# Returns true iff all characters of `str` are presents
	# at the expected index in `self.`
	# The first character of `str` being at `pos`, the second
	# character being at `pos+1` and so on...
	#
	# This means that all characters of `str` need to be inside `self`.
	#
	# ~~~
	# assert "abcd".has_substring("xab", -1)         == false
	# assert "abcd".has_substring("cdx", 2)          == false
	# ~~~
	#
	# And that the empty string is always a valid substring.
	#
	# ~~~
	# assert "abcd".has_substring("", 2)             == true
	# assert "abcd".has_substring("", 200)           == true
	# ~~~
	fun has_substring(str: String, pos: Int): Bool
	do
		if str.is_empty then return true
		if pos < 0 or pos + str.length > length then return false
		var myiter = self.chars.iterator_from(pos)
		var itsiter = str.chars.iterator
		while myiter.is_ok and itsiter.is_ok do
			if myiter.item != itsiter.item then return false
			myiter.next
			itsiter.next
		end
		if itsiter.is_ok then return false
		return true
	end

	# Is this string prefixed by `prefix`?
	#
	# ~~~
	# assert "abcd".has_prefix("ab")           ==  true
	# assert "abcbc".has_prefix("bc")          ==  false
	# assert "ab".has_prefix("abcd")           ==  false
	# ~~~
	fun has_prefix(prefix: String): Bool do return has_substring(prefix,0)

	# Is this string suffixed by `suffix`?
	#
	# ~~~
	# assert "abcd".has_suffix("abc")	     ==  false
	# assert "abcd".has_suffix("bcd")	     ==  true
	# ~~~
	fun has_suffix(suffix: String): Bool do return has_substring(suffix, length - suffix.length)

	# Returns `self` as the corresponding integer
	#
	# ~~~
	# assert "123".to_i        == 123
	# assert "-1".to_i         == -1
	# assert "0x64".to_i       == 100
	# assert "0b1100_0011".to_i== 195
	# assert "--12".to_i       == 12
	# assert "+45".to_i        == 45
	# ~~~
	#
	# REQUIRE: `self`.`is_int`
	fun to_i: Int is abstract

	# If `self` contains a float, return the corresponding float
	#
	# ~~~
	# assert "123".to_f        == 123.0
	# assert "-1".to_f         == -1.0
	# assert "-1.2e-3".to_f    == -0.0012
	# ~~~
	fun to_f: Float
	do
		# Shortcut
		return to_s.to_cstring.atof
	end

	# If `self` contains only digits and alpha <= 'f', return the corresponding integer.
	#
	# ~~~
	# assert "ff".to_hex == 255
	# ~~~
	fun to_hex(pos, ln: nullable Int): Int do
		var res = 0
		if pos == null then pos = 0
		if ln == null then ln = length - pos
		var max = pos + ln
		for i in [pos .. max[ do
			res <<= 4
			res += self[i].from_hex
		end
		return res
	end

	# If `self` contains only digits <= '7', return the corresponding integer.
	#
	# ~~~
	# assert "714".to_oct == 460
	# ~~~
	fun to_oct: Int do return a_to(8)

	# If `self` contains only '0' et '1', return the corresponding integer.
	#
	# ~~~
	# assert "101101".to_bin == 45
	# ~~~
	fun to_bin: Int do return a_to(2)

	# If `self` contains only digits '0' .. '9', return the corresponding integer.
	#
	# ~~~
	# assert "108".to_dec == 108
	# ~~~
	fun to_dec: Int do return a_to(10)

	# If `self` contains only digits and letters, return the corresponding integer in a given base
	#
	# ~~~
	# assert "120".a_to(3)     == 15
	# ~~~
	fun a_to(base: Int) : Int
	do
		var i = 0
		var neg = false

		for j in [0..length[ do
			var c = chars[j]
			var v = c.to_i
			if v > base then
				if neg then
					return -i
				else
					return i
				end
			else if v < 0 then
				neg = true
			else
				i = i * base + v
			end
		end
		if neg then
			return -i
		else
			return i
		end
	end

	# Is this string in a valid numeric format compatible with `to_f`?
	#
	# ~~~
	# assert "123".is_numeric  == true
	# assert "1.2".is_numeric  == true
	# assert "-1.2".is_numeric == true
	# assert "-1.23e-2".is_numeric == true
	# assert "1..2".is_numeric == false
	# assert "".is_numeric     == false
	# ~~~
	fun is_numeric: Bool
	do
		var has_point = false
		var e_index = -1
		for i in [0..length[ do
			var c = chars[i]
			if not c.is_numeric then
				if c == '.' and not has_point then
					has_point = true
				else if c == 'e' and e_index == -1 and i > 0 and i < length - 1 and chars[i-1] != '-' then
					e_index = i
				else if c == '-' and i == e_index + 1 and i < length - 1 then
				else
					return false
				end
			end
		end
		return not is_empty
	end

	# Returns `true` if the string contains only Hex chars
	#
	# ~~~
	# assert "048bf".is_hex  == true
	# assert "ABCDEF".is_hex  == true
	# assert "0G".is_hex == false
	# ~~~
	fun is_hex: Bool
	do
		for i in [0..length[ do
			var c = chars[i]
			if not (c >= 'a' and c <= 'f') and
			   not (c >= 'A' and c <= 'F') and
			   not (c >= '0' and c <= '9') then return false
		end
		return true
	end

	# Returns `true` if the string contains only Binary digits
	#
	# ~~~
	# assert "1101100".is_bin  == true
	# assert "1101020".is_bin  == false
	# ~~~
	fun is_bin: Bool do
		for i in chars do if i != '0' and i != '1' then return false
		return true
	end

	# Returns `true` if the string contains only Octal digits
	#
	# ~~~
	# assert "213453".is_oct  == true
	# assert "781".is_oct     == false
	# ~~~
	fun is_oct: Bool do
		for i in chars do if i < '0' or i > '7' then return false
		return true
	end

	# Returns `true` if the string contains only Decimal digits
	#
	# ~~~
	# assert "10839".is_dec == true
	# assert "164F".is_dec  == false
	# ~~~
	fun is_dec: Bool do
		for i in chars do if i < '0' or i > '9' then return false
		return true
	end

	# Are all letters in `self` upper-case ?
	#
	# ~~~
	# assert "HELLO WORLD".is_upper == true
	# assert "%$&%!".is_upper       == true
	# assert "hello world".is_upper == false
	# assert "Hello World".is_upper == false
	# ~~~
	fun is_upper: Bool
	do
		for i in [0..length[ do
			var char = chars[i]
			if char.is_lower then return false
		end
		return true
	end

	# Are all letters in `self` lower-case ?
	#
	# ~~~
	# assert "hello world".is_lower == true
	# assert "%$&%!".is_lower       == true
	# assert "Hello World".is_lower == false
	# ~~~
	fun is_lower: Bool
	do
		for i in [0..length[ do
			var char = chars[i]
			if char.is_upper then return false
		end
		return true
	end

	# Removes the whitespaces at the beginning of self
	#
	# ~~~
	# assert " \n\thello \n\t".l_trim == "hello \n\t"
	# ~~~
	#
	# `Char::is_whitespace` determines what is a whitespace.
	fun l_trim: SELFTYPE
	do
		var iter = self.chars.iterator
		while iter.is_ok do
			if not iter.item.is_whitespace then break
			iter.next
		end
		if iter.index == length then return self.empty
		return self.substring_from(iter.index)
	end

	# Removes the whitespaces at the end of self
	#
	# ~~~
	# assert " \n\thello \n\t".r_trim == " \n\thello"
	# ~~~
	#
	# `Char::is_whitespace` determines what is a whitespace.
	fun r_trim: SELFTYPE
	do
		var iter = self.chars.reverse_iterator
		while iter.is_ok do
			if not iter.item.is_whitespace then break
			iter.next
		end
		if iter.index < 0 then return self.empty
		return self.substring(0, iter.index + 1)
	end

	# Trims trailing and preceding white spaces
	#
	# ~~~
	# assert "  Hello  World !  ".trim   == "Hello  World !"
	# assert "\na\nb\tc\t".trim          == "a\nb\tc"
	# ~~~
	#
	# `Char::is_whitespace` determines what is a whitespace.
	fun trim: SELFTYPE do return (self.l_trim).r_trim

	# Is the string non-empty but only made of whitespaces?
	#
	# ~~~
	# assert " \n\t ".is_whitespace    == true
	# assert "  hello  ".is_whitespace == false
	# assert "".is_whitespace          == false
	# ~~~
	#
	# `Char::is_whitespace` determines what is a whitespace.
	fun is_whitespace: Bool
	do
		if is_empty then return false
		for c in self.chars do
			if not c.is_whitespace then return false
		end
		return true
	end

	# Returns `self` removed from its last line terminator (if any).
	#
	# ~~~
	# assert "Hello\n".chomp == "Hello"
	# assert "Hello".chomp   == "Hello"
	#
	# assert "\n".chomp == ""
	# assert "".chomp   == ""
	# ~~~
	#
	# Line terminators are `"\n"`, `"\r\n"` and `"\r"`.
	# A single line terminator, the last one, is removed.
	#
	# ~~~
	# assert "\r\n".chomp     == ""
	# assert "\r\n\n".chomp   == "\r\n"
	# assert "\r\n\r\n".chomp == "\r\n"
	# assert "\r\n\r".chomp   == "\r\n"
	# ~~~
	#
	# Note: unlike with most IO methods like `Reader::read_line`,
	# a single `\r` is considered here to be a line terminator and will be removed.
	fun chomp: SELFTYPE
	do
		var len = length
		if len == 0 then return self
		var l = self.chars.last
		if l == '\r' then
			return substring(0, len-1)
		else if l != '\n' then
			return self
		else if len > 1 and self.chars[len-2] == '\r' then
			return substring(0, len-2)
		else
			return substring(0, len-1)
		end
	end

	# Justify `self` in a space of `length`
	#
	# `left` is the space ratio on the left side.
	# * 0.0 for left-justified (no space at the left)
	# * 1.0 for right-justified (all spaces at the left)
	# * 0.5 for centered (half the spaces at the left)
	#
	# `char`, or `' '` by default, is repeated to pad the empty space.
	#
	# Examples
	#
	# ~~~
	# assert "hello".justify(10, 0.0)  == "hello     "
	# assert "hello".justify(10, 1.0)  == "     hello"
	# assert "hello".justify(10, 0.5)  == "  hello   "
	# assert "hello".justify(10, 0.5, '.') == "..hello..."
	# ~~~
	#
	# If `length` is not enough, `self` is returned as is.
	#
	# ~~~
	# assert "hello".justify(2, 0.0)   == "hello"
	# ~~~
	#
	# REQUIRE: `left >= 0.0 and left <= 1.0`
	# ENSURE: `self.length <= length implies result.length == length`
	# ENSURE: `self.length >= length implies result == self`
	fun justify(length: Int, left: Float, char: nullable Char): String
	do
		var pad = (char or else ' ').to_s
		var diff = length - self.length
		if diff <= 0 then return to_s
		assert left >= 0.0 and left <= 1.0
		var before = (diff.to_f * left).to_i
		return pad * before + self + pad * (diff-before)
	end

	# Mangle a string to be a unique string only made of alphanumeric characters and underscores.
	#
	# This method is injective (two different inputs never produce the same
	# output) and the returned string always respect the following rules:
	#
	# * Contains only US-ASCII letters, digits and underscores.
	# * Never starts with a digit.
	# * Never ends with an underscore.
	# * Never contains two contiguous underscores.
	#
	# Examples:
	#
	# ~~~
	# assert "42_is/The answer!".to_cmangle == "_52d2_is_47dThe_32danswer_33d"
	# assert "__".to_cmangle == "_95d_95d"
	# assert "__d".to_cmangle == "_95d_d"
	# assert "_d_".to_cmangle == "_d_95d"
	# assert "_42".to_cmangle == "_95d42"
	# assert "foo".to_cmangle == "foo"
	# assert "".to_cmangle == ""
	# ~~~
	fun to_cmangle: String
	do
		if is_empty then return ""
		var res = new Buffer
		var underscore = false
		var start = 0
		var c = self[0]

		if c >= '0' and c <= '9' then
			res.add('_')
			res.append(c.code_point.to_s)
			res.add('d')
			start = 1
		end
		for i in [start..length[ do
			c = self[i]
			if (c >= 'a' and c <= 'z') or (c >='A' and c <= 'Z') then
				res.add(c)
				underscore = false
				continue
			end
			if underscore then
				res.append('_'.code_point.to_s)
				res.add('d')
			end
			if c >= '0' and c <= '9' then
				res.add(c)
				underscore = false
			else if c == '_' then
				res.add(c)
				underscore = true
			else
				res.add('_')
				res.append(c.code_point.to_s)
				res.add('d')
				underscore = false
			end
		end
		if underscore then
			res.append('_'.code_point.to_s)
			res.add('d')
		end
		return res.to_s
	end

	# Escape `"` `\` `'`, trigraphs and non printable characters using the rules of literal C strings and characters
	#
	# ~~~
	# assert "abAB12<>&".escape_to_c       == "abAB12<>&"
	# assert "\n\"'\\".escape_to_c         == "\\n\\\"\\'\\\\"
	# assert "allo???!".escape_to_c        == "allo??\\?!"
	# assert "??=??/??'??(??)".escape_to_c == "?\\?=?\\?/??\\'?\\?(?\\?)"
	# assert "??!??<??>??-".escape_to_c    == "?\\?!?\\?<?\\?>?\\?-"
	# ~~~
	#
	# Most non-printable characters (bellow ASCII 32) are escaped to an octal form `\nnn`.
	# Three digits are always used to avoid following digits to be interpreted as an element
	# of the octal sequence.
	#
	# ~~~
	# assert "{0.code_point}{1.code_point}{8.code_point}{31.code_point}{32.code_point}".escape_to_c == "\\000\\001\\010\\037 "
	# ~~~
	#
	# The exceptions are the common `\t` and `\n`.
	fun escape_to_c: String
	do
		var b = new Buffer
		for i in [0..length[ do
			var c = chars[i]
			if c == '\n' then
				b.append("\\n")
			else if c == '\t' then
				b.append("\\t")
			else if c == '"' then
				b.append("\\\"")
			else if c == '\'' then
				b.append("\\\'")
			else if c == '\\' then
				b.append("\\\\")
			else if c == '?' then
				# Escape if it is the last question mark of a ANSI C trigraph.
				var j = i + 1
				if j < length then
					var next = chars[j]
					# We ignore `??'` because it will be escaped as `??\'`.
					if
						next == '!' or
						next == '(' or
						next == ')' or
						next == '-' or
						next == '/' or
						next == '<' or
						next == '=' or
						next == '>'
					then b.add('\\')
				end
				b.add('?')
			else if c.code_point < 32 then
				b.add('\\')
				var oct = c.code_point.to_base(8)
				# Force 3 octal digits since it is the
				# maximum allowed in the C specification
				if oct.length == 1 then
					b.add('0')
					b.add('0')
				else if oct.length == 2 then
					b.add('0')
				end
				b.append(oct)
			else
				b.add(c)
			end
		end
		return b.to_s
	end

	# Escape additionnal characters
	# The result might no be legal in C but be used in other languages
	#
	# ~~~
	# assert "ab|\{\}".escape_more_to_c("|\{\}") == "ab\\|\\\{\\\}"
	# assert "allo???!".escape_more_to_c("")     == "allo??\\?!"
	# ~~~
	fun escape_more_to_c(chars: String): String
	do
		var b = new Buffer
		for c in escape_to_c.chars do
			if chars.chars.has(c) then
				b.add('\\')
			end
			b.add(c)
		end
		return b.to_s
	end

	# Escape to C plus braces
	#
	# ~~~
	# assert "\n\"'\\\{\}".escape_to_nit      == "\\n\\\"\\'\\\\\\\{\\\}"
	# ~~~
	fun escape_to_nit: String do return escape_more_to_c("\{\}")

	# Escape to POSIX Shell (sh).
	#
	# Abort if the text contains a null byte.
	#
	# ~~~
	# assert "\n\"'\\\{\}0".escape_to_sh == "'\n\"'\\''\\\{\}0'"
	# ~~~
	fun escape_to_sh: String do
		var b = new Buffer
		b.chars.add '\''
		for i in [0..length[ do
			var c = chars[i]
			if c == '\'' then
				b.append("'\\''")
			else
				assert without_null_byte: c != '\0'
				b.add(c)
			end
		end
		b.chars.add '\''
		return b.to_s
	end

	# Escape to include in a Makefile
	#
	# Unfortunately, some characters are not escapable in Makefile.
	# These characters are `;`, `|`, `\`, and the non-printable ones.
	# They will be rendered as `"?{hex}"`.
	fun escape_to_mk: String do
		var b = new Buffer
		for i in [0..length[ do
			var c = chars[i]
			if c == '$' then
				b.append("$$")
			else if c == ':' or c == ' ' or c == '#' then
				b.add('\\')
				b.add(c)
			else if c.code_point < 32 or c == ';' or c == '|' or c == '\\' then
				b.append("?{c.code_point.to_base(16)}")
			else
				b.add(c)
			end
		end
		return b.to_s
	end

	# Return a string where Nit escape sequences are transformed.
	#
	# ~~~
	# var s = "\\n"
	# assert s.length        ==  2
	# var u = s.unescape_nit
	# assert u.length        ==  1
	# assert u.chars[0].code_point      ==  10 # (the ASCII value of the "new line" character)
	# ~~~
	fun unescape_nit: String
	do
		var res = new Buffer.with_cap(self.length)
		var was_slash = false
		for i in [0..length[ do
			var c = chars[i]
			if not was_slash then
				if c == '\\' then
					was_slash = true
				else
					res.add(c)
				end
				continue
			end
			was_slash = false
			if c == 'n' then
				res.add('\n')
			else if c == 'r' then
				res.add('\r')
			else if c == 't' then
				res.add('\t')
			else if c == '0' then
				res.add('\0')
			else
				res.add(c)
			end
		end
		return res.to_s
	end

	# Returns `self` with all characters escaped with their UTF-16 representation
	#
	# ~~~
	# assert "Aèあ𐏓".escape_to_utf16 == "\\u0041\\u00e8\\u3042\\ud800\\udfd3"
	# ~~~
	fun escape_to_utf16: String do
		var buf = new Buffer
		for i in chars do buf.append i.escape_to_utf16
		return buf.to_s
	end

	# Returns the Unicode char escaped by `self`
	#
	# ~~~
	# assert "\\u0041".from_utf16_escape == 'A'
	# assert "\\ud800\\udfd3".from_utf16_escape == '𐏓'
	# assert "\\u00e8".from_utf16_escape == 'è'
	# assert "\\u3042".from_utf16_escape == 'あ'
	# ~~~
	fun from_utf16_escape(pos, ln: nullable Int): Char do
		if pos == null then pos = 0
		if ln == null then ln = length - pos
		if ln < 6 then return 0xFFFD.code_point
		var cp = from_utf16_digit(pos + 2).to_u32
		if cp < 0xD800u32 then return cp.code_point
		if cp > 0xDFFFu32 then return cp.code_point
		if cp > 0xDBFFu32 then return 0xFFFD.code_point
		if ln == 6 then return 0xFFFD.code_point
		if ln < 12 then return 0xFFFD.code_point
		cp <<= 16
		cp += from_utf16_digit(pos + 8).to_u32
		var cplo = cp & 0xFFFFu32
		if cplo < 0xDC00u32 then return 0xFFFD.code_point
		if cplo > 0xDFFFu32 then return 0xFFFD.code_point
		return cp.from_utf16_surr.code_point
	end

	# Returns a UTF-16 escape value
	#
	# ~~~
	# var s = "\\ud800\\udfd3"
	# assert s.from_utf16_digit(2) == 0xD800
	# assert s.from_utf16_digit(8) == 0xDFD3
	# ~~~
	fun from_utf16_digit(pos: nullable Int): Int do
		if pos == null then pos = 0
		return to_hex(pos, 4)
	end

	# Encode `self` to percent (or URL) encoding
	#
	# ~~~
	# assert "aBc09-._~".to_percent_encoding == "aBc09-._~"
	# assert "%()< >".to_percent_encoding == "%25%28%29%3c%20%3e"
	# assert ".com/post?e=asdf&f=123".to_percent_encoding == ".com%2fpost%3fe%3dasdf%26f%3d123"
	# assert "éあいう".to_percent_encoding == "%c3%a9%e3%81%82%e3%81%84%e3%81%86"
	# ~~~
	fun to_percent_encoding: String
	do
		var buf = new Buffer

		for i in [0..length[ do
			var c = chars[i]
			if (c >= '0' and c <= '9') or
			   (c >= 'a' and c <= 'z') or
			   (c >= 'A' and c <= 'Z') or
			   c == '-' or c == '.' or
			   c == '_' or c == '~'
			then
				buf.add c
			else
				var bytes = c.to_s.bytes
				for b in bytes do buf.append "%{b.to_i.to_hex}"
			end
		end

		return buf.to_s
	end

	# Decode `self` from percent (or URL) encoding to a clear string
	#
	# Invalid '%' are not decoded.
	#
	# ~~~
	# assert "aBc09-._~".from_percent_encoding == "aBc09-._~"
	# assert "%25%28%29%3c%20%3e".from_percent_encoding == "%()< >"
	# assert ".com%2fpost%3fe%3dasdf%26f%3d123".from_percent_encoding == ".com/post?e=asdf&f=123"
	# assert "%25%28%29%3C%20%3E".from_percent_encoding == "%()< >"
	# assert "incomplete %".from_percent_encoding == "incomplete %"
	# assert "invalid % usage".from_percent_encoding == "invalid % usage"
	# assert "%c3%a9%e3%81%82%e3%81%84%e3%81%86".from_percent_encoding == "éあいう"
	# assert "%1 %A %C3%A9A9".from_percent_encoding == "%1 %A éA9"
	# ~~~
	fun from_percent_encoding: String
	do
		var len = byte_length
		var has_percent = false
		for c in chars do
			if c == '%' then
				len -= 2
				has_percent = true
			end
		end

		# If no transformation is needed, return self as a string
		if not has_percent then return to_s

		var buf = new CString(len)
		var i = 0
		var l = 0
		while i < length do
			var c = chars[i]
			if c == '%' then
				if i + 2 >= length then
					# What follows % has been cut off
					buf[l] = u'%'
				else
					i += 1
					var hex_s = substring(i, 2)
					if hex_s.is_hex then
						var hex_i = hex_s.to_hex
						buf[l] = hex_i
						i += 1
					else
						# What follows a % is not Hex
						buf[l] = u'%'
						i -= 1
					end
				end
			else buf[l] = c.code_point

			i += 1
			l += 1
		end

		return buf.to_s_unsafe(l, copy=false)
	end

	# Escape the characters `<`, `>`, `&`, `"`, `'` and `/` as HTML/XML entity references.
	#
	# ~~~
	# assert "a&b-<>\"x\"/'".html_escape      ==  "a&amp;b-&lt;&gt;&#34;x&#34;&#47;&#39;"
	# ~~~
	#
	# SEE: <https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content>
	fun html_escape: String
	do
		var buf: nullable Buffer = null

		for i in [0..length[ do
			var c = chars[i]
			var sub = null
			if c == '&' then
				sub = "&amp;"
			else if c == '<' then
				sub = "&lt;"
			else if c == '>' then
				sub = "&gt;"
			else if c == '"' then
				sub = "&#34;"
			else if c == '\'' then
				sub = "&#39;"
			else if c == '/' then
				sub = "&#47;"
			else
				if buf != null then buf.add c
				continue
			end
			if buf == null then
				buf = new Buffer
				for j in [0..i[ do buf.add chars[j]
			end
			buf.append sub
		end

		if buf == null then return self.to_s
		return buf.to_s
	end

	# Equality of text
	# Two pieces of text are equals if thez have the same characters in the same order.
	#
	# ~~~
	# assert "hello" == "hello"
	# assert "hello" != "HELLO"
	# assert "hello" == "hel"+"lo"
	# ~~~
	#
	# Things that are not Text are not equal.
	#
	# ~~~
	# assert "9" != '9'
	# assert "9" != ['9']
	# assert "9" != 9
	#
	# assert "9".chars.first == '9'   # equality of Char
	# assert "9".chars       == ['9'] # equality of Sequence
	# assert "9".to_i        == 9     # equality of Int
	# ~~~
	redef fun ==(o)
	do
		if o == null then return false
		if not o isa Text then return false
		if self.is_same_instance(o) then return true
		if self.length != o.length then return false
		return self.chars == o.chars
	end

	# Lexicographical comparaison
	#
	# ~~~
	# assert "abc" < "xy"
	# assert "ABC" < "abc"
	# ~~~
	redef fun <(other)
	do
		var self_chars = self.chars.iterator
		var other_chars = other.chars.iterator

		while self_chars.is_ok and other_chars.is_ok do
			if self_chars.item < other_chars.item then return true
			if self_chars.item > other_chars.item then return false
			self_chars.next
			other_chars.next
		end

		if self_chars.is_ok then
			return false
		else
			return true
		end
	end

	# Escape string used in labels for graphviz
	#
	# ~~~
	# assert ">><<".escape_to_dot == "\\>\\>\\<\\<"
	# ~~~
	fun escape_to_dot: String
	do
		return escape_more_to_c("|\{\}<>")
	end

	private var hash_cache: nullable Int = null

	redef fun hash
	do
		if hash_cache == null then
			# djb2 hash algorithm
			var h = 5381

			for i in [0..length[ do
				var char = chars[i]
				h = (h << 5) + h + char.code_point
			end

			hash_cache = h
		end
		return hash_cache.as(not null)
	end

	# Format `self` by replacing each `%n` with the `n`th item of `args`
	#
	# The character `%` followed by something other than a number are left as is.
	# To represent a `%` followed by a number, double the `%`, as in `%%7`.
	#
	# ~~~
	# assert "This %0 is a %1.".format("String", "formatted String") == "This String is a formatted String."
	# assert "Do not escape % nor %%1".format("unused") == "Do not escape % nor %1"
	# ~~~
	fun format(args: Object...): String do
		var s = new Array[Text]
		var curr_st = 0
		var i = 0
		while i < length do
			if self[i] == '%' then
				var fmt_st = i
				i += 1
				var ciph_st = i
				while i < length and self[i].is_numeric do
					i += 1
				end

				var ciph_len = i - ciph_st
				if ciph_len == 0 then
					# What follows '%' is not a number.
					s.push substring(curr_st, i - curr_st)
					if i < length and self[i] == '%' then
						# Skip the next `%`
						i += 1
					end
					curr_st = i
					continue
				end

				var arg_index = substring(ciph_st, ciph_len).to_i
				if arg_index >= args.length then continue

				s.push substring(curr_st, fmt_st - curr_st)
				s.push args[arg_index].to_s

				curr_st = i
				i -= 1
			end
			i += 1
		end
		s.push substring(curr_st, length - curr_st)
		return s.plain_to_s
	end

	# Return the Levenshtein distance between two strings
	#
	# ~~~
	# assert "abcd".levenshtein_distance("abcd") == 0
	# assert "".levenshtein_distance("abcd")     == 4
	# assert "abcd".levenshtein_distance("")     == 4
	# assert "abcd".levenshtein_distance("xyz")  == 4
	# assert "abcd".levenshtein_distance("xbdy") == 3
	# ~~~
	fun levenshtein_distance(other: String): Int
	do
		var slen = self.length
		var olen = other.length

		# fast cases
		if slen == 0 then return olen
		if olen == 0 then return slen
		if self == other then return 0

		# previous row of distances
		var v0 = new Array[Int].with_capacity(olen+1)

		# current row of distances
		var v1 = new Array[Int].with_capacity(olen+1)

		for j in [0..olen] do
			# prefix insert cost
			v0[j] = j
		end

		for i in [0..slen[ do

			# prefix delete cost
			v1[0] = i + 1

			for j in [0..olen[ do
				# delete cost
				var cost1 = v1[j] + 1
				# insert cost
				var cost2 = v0[j + 1] + 1
				# same char cost (+0)
				var cost3 = v0[j]
				# change cost
				if self[i] != other[j] then cost3 += 1
				# keep the min
				v1[j+1] = cost1.min(cost2).min(cost3)
			end

			# Switch columns:
			# * v1 become v0 in the next iteration
			# * old v0 is reused as the new v1
			var tmp = v1
			v1 = v0
			v0 = tmp
		end

		return v0[olen]
	end

	# Copies `n` bytes from `self` at `src_offset` into `dest` starting at `dest_offset`
	#
	# Basically a high-level synonym of CString::copy_to
	#
	# REQUIRE: `n` must be large enough to contain `len` bytes
	#
	# ~~~
	# var ns = new CString(8)
	# "Text is String".copy_to_native(ns, 8, 2, 0)
	# assert ns.to_s_with_length(8) == "xt is St"
	# ~~~
	fun copy_to_native(dest: CString, n, src_offset, dest_offset: Int) do
		var mypos = src_offset
		var itspos = dest_offset
		while n > 0 do
			dest[itspos] = self.bytes[mypos]
			itspos += 1
			mypos += 1
			n -= 1
		end
	end

	# Packs the content of a string in packs of `ln` chars.
	# This variant ensures that only the last element might be smaller than `ln`
	#
	# ~~~
	# var s = "abcdefghijklmnopqrstuvwxyz"
	# assert s.pack_l(4) == ["abcd","efgh","ijkl","mnop","qrst","uvwx","yz"]
	# ~~~
	fun pack_l(ln: Int): Array[Text] do
		var st = 0
		var retarr = new Array[Text].with_capacity(length / ln + length % ln)
		while st < length do
			retarr.add(substring(st, ln))
			st += ln
		end
		return retarr
	end

	# Packs the content of a string in packs of `ln` chars.
	# This variant ensures that only the first element might be smaller than `ln`
	#
	# ~~~
	# var s = "abcdefghijklmnopqrstuvwxyz"
	# assert s.pack_r(4) == ["ab","cdef","ghij","klmn","opqr","stuv","wxyz"]
	# ~~~
	fun pack_r(ln: Int): Array[Text] do
		var st = length
		var retarr = new Array[Text].with_capacity(length / ln + length % ln)
		while st >= 0 do
			retarr.add(substring(st - ln, ln))
			st -= ln
		end
		return retarr.reversed
	end

	# Concatenates self `i` times
	#
	# ~~~
	# assert "abc" * 4 == "abcabcabcabc"
	# assert "abc" * 1 == "abc"
	# assert "abc" * 0 == ""
	# var b = new Buffer
	# b.append("天地")
	# b = b * 4
	# assert b == "天地天地天地天地"
	# ~~~
	fun *(i: Int): SELFTYPE is abstract

	# Insert `s` at `pos`.
	#
	# ~~~
	# assert "helloworld".insert_at(" ", 5)	== "hello world"
	# var b = new Buffer
	# b.append("Hello世界")
	# b = b.insert_at(" beautiful ", 5)
	# assert b == "Hello beautiful 世界"
	# ~~~
	fun insert_at(s: String, pos: Int): SELFTYPE is abstract

	# Returns a reversed version of self
	#
	# ~~~
	# assert "hello".reversed  == "olleh"
	# assert "bob".reversed    == "bob"
	# assert "".reversed       == ""
	# ~~~
	fun reversed: SELFTYPE is abstract

	# A upper case version of `self`
	#
	# ~~~
	# assert "Hello World!".to_upper     == "HELLO WORLD!"
	# ~~~
	fun to_upper: SELFTYPE is abstract

	# A lower case version of `self`
	#
	# ~~~
	# assert "Hello World!".to_lower     == "hello world!"
	# ~~~
	fun to_lower : SELFTYPE is abstract

	# Takes a camel case `self` and converts it to snake case
	#
	# ~~~
	# assert "randomMethodId".to_snake_case == "random_method_id"
	# ~~~
	#
	# The rules are the following:
	#
	# An uppercase is always converted to a lowercase
	#
	# ~~~
	# assert "HELLO_WORLD".to_snake_case == "hello_world"
	# ~~~
	#
	# An uppercase that follows a lowercase is prefixed with an underscore
	#
	# ~~~
	# assert "HelloTheWORLD".to_snake_case == "hello_the_world"
	# ~~~
	#
	# An uppercase that follows an uppercase and is followed by a lowercase, is prefixed with an underscore
	#
	# ~~~
	# assert "HelloTHEWorld".to_snake_case == "hello_the_world"
	# ~~~
	#
	# All other characters are kept as is; `self` does not need to be a proper CamelCased string.
	#
	# ~~~
	# assert "=-_H3ll0Th3W0rld_-=".to_snake_case == "=-_h3ll0th3w0rld_-="
	# ~~~
	fun to_snake_case: SELFTYPE is abstract

	# Takes a snake case `self` and converts it to camel case
	#
	# ~~~
	# assert "random_method_id".to_camel_case == "randomMethodId"
	# ~~~
	#
	# If the identifier is prefixed by an underscore, the underscore is ignored
	#
	# ~~~
	# assert "_private_field".to_camel_case == "_privateField"
	# ~~~
	#
	# If `self` is upper, it is returned unchanged
	#
	# ~~~
	# assert "RANDOM_ID".to_camel_case == "RANDOM_ID"
	# ~~~
	#
	# If there are several consecutive underscores, they are considered as a single one
	#
	# ~~~
	# assert "random__method_id".to_camel_case == "randomMethodId"
	# ~~~
	fun to_camel_case: SELFTYPE is abstract

	# Returns a capitalized `self`
	#
	# Letters that follow a letter are lowercased
	# Letters that follow a non-letter are upcased.
	#
	# If `keep_upper = true`, already uppercase letters are not lowercased.
	#
	# SEE : `Char::is_letter` for the definition of letter.
	#
	# ~~~
	# assert "jAVASCRIPT".capitalized == "Javascript"
	# assert "i am root".capitalized == "I Am Root"
	# assert "ab_c -ab0c ab\nc".capitalized == "Ab_C -Ab0C Ab\nC"
	# assert "preserve my ACRONYMS".capitalized(keep_upper=true) == "Preserve My ACRONYMS"
	# ~~~
	fun capitalized(keep_upper: nullable Bool): SELFTYPE do
		if length == 0 then return self

		var buf = new Buffer.with_cap(length)
		buf.capitalize(keep_upper=keep_upper, src=self)
		return buf.to_s
	end
end

# All kinds of array-based text representations.
abstract class FlatText
	super Text

	# Underlying CString (`char*`)
	#
	# Warning: Might be void in some subclasses, be sure to check
	# if set before using it.
	var items: CString is noinit

	# Returns a char* starting at position `first_byte`
	#
	# WARNING: If you choose to use this service, be careful of the following.
	#
	# Strings and CString are *ideally* always allocated through a Garbage Collector.
	# Since the GC tracks the use of the pointer for the beginning of the char*, it may be
	# deallocated at any moment, rendering the pointer returned by this function invalid.
	# Any access to freed memory may very likely cause undefined behaviour or a crash.
	# (Failure to do so will most certainly result in long and painful debugging hours)
	#
	# The only safe use of this pointer is if it is ephemeral (e.g. read in a C function
	# then immediately return).
	#
	# As always, do not modify the content of the String in C code, if this is what you want
	# copy locally the char* as Nit Strings are immutable.
	fun fast_cstring: CString is abstract

	redef var length = 0

	redef var byte_length = 0

	redef fun output
	do
		var i = 0
		while i < length do
			items[i].output
			i += 1
		end
	end

	redef fun copy_to_native(dest, n, src_offset, dest_offset) do
		items.copy_to(dest, n, src_offset, dest_offset)
	end
end

# Abstract class for the SequenceRead compatible
# views on the chars of any Text
private abstract class StringCharView
	super SequenceRead[Char]

	type SELFTYPE: Text

	var target: SELFTYPE

	redef fun is_empty do return target.is_empty

	redef fun length do return target.length

	redef fun iterator: IndexedIterator[Char] do return self.iterator_from(0)

	redef fun reverse_iterator do return self.reverse_iterator_from(self.length - 1)
end

# Abstract class for the SequenceRead compatible
# views on the bytes of any Text
private abstract class StringByteView
	super SequenceRead[Int]

	type SELFTYPE: Text

	var target: SELFTYPE

	redef fun is_empty do return target.is_empty

	redef fun length do return target.byte_length

	redef fun iterator do return self.iterator_from(0)

	redef fun reverse_iterator do return self.reverse_iterator_from(target.byte_length - 1)
end

# Immutable sequence of characters.
#
# String objects may be created using literals.
#
# ~~~
# assert "Hello World!" isa String
# ~~~
abstract class String
	super Text

	redef type SELFTYPE: String is fixed

	redef fun to_s do return self

	redef fun clone do return self

	redef fun to_buffer do return new Buffer.from_text(self)

	redef fun to_camel_case do
		if self.is_upper then return self

		var new_str = new Buffer.with_cap(length)
		new_str.append self
		new_str.camel_case
		return new_str.to_s
	end

	redef fun to_snake_case do
		if self.is_lower then return self

		var new_str = new Buffer.with_cap(self.length)
		new_str.append self
		new_str.snake_case
		return new_str.to_s
	end
end

# A mutable sequence of characters.
abstract class Buffer
	super Text

	# Returns an arbitrary subclass of `Buffer` with default parameters
	new is abstract

	# Returns an instance of a subclass of `Buffer` with `i` base capacity
	new with_cap(i: Int) is abstract

	# Returns an instance of a subclass of `Buffer` with `t` as content
	new from_text(t: Text) do
		var ret = new Buffer.with_cap(t.byte_length)
		ret.append t
		return ret
	end

	redef type SELFTYPE: Buffer is fixed

	# Copy-On-Write flag
	#
	# If the `Buffer` was to_s'd, the next in-place altering
	# operation will cause the current `Buffer` to be re-allocated.
	#
	# The flag will then be set at `false`.
	protected var written = false

	# Modifies the char contained at pos `index`
	fun []=(index: Int, item: Char) is abstract

	redef fun to_buffer do return clone

	# ~~~
	# var b = new Buffer
	# b.append("Buffer!")
	# var c = b.clone
	# assert b == c
	# ~~~
	redef fun clone do
		var cln = new Buffer.with_cap(byte_length)
		cln.append self
		return cln
	end

	# Adds a char `c` at the end of self
	fun add(c: Char) is abstract

	# Clears the buffer
	#
	# ~~~
	# var b = new Buffer
	# b.append "hello"
	# assert not b.is_empty
	# b.clear
	# assert b.is_empty
	# ~~~
	fun clear is abstract

	# Enlarges the subsequent array containing the chars of self
	fun enlarge(cap: Int) is abstract

	# Adds the content of text `s` at the end of self
	#
	# ~~~
	# var b = new Buffer
	# b.append "hello"
	# b.append "world"
	# assert b == "helloworld"
	# ~~~
	fun append(s: Text) is abstract

	# `self` is appended in such a way that `self` is repeated `r` times
	#
	# ~~~
	# var b = new Buffer
	# b.append "hello"
	# b.times 3
	# assert b == "hellohellohello"
	# ~~~
	fun times(r: Int) is abstract

	# Reverses itself in-place
	#
	# ~~~
	# var b = new Buffer
	# b.append("hello")
	# b.reverse
	# assert b == "olleh"
	# ~~~
	fun reverse is abstract

	# Changes each lower-case char in `self` by its upper-case variant
	#
	# ~~~
	# var b = new Buffer
	# b.append("Hello World!")
	# b.upper
	# assert b == "HELLO WORLD!"
	# ~~~
	fun upper is abstract

	# Changes each upper-case char in `self` by its lower-case variant
	#
	# ~~~
	# var b = new Buffer
	# b.append("Hello World!")
	# b.lower
	# assert b == "hello world!"
	# ~~~
	fun lower is abstract

	# Capitalizes each word in `self`
	#
	# Letters that follow a letter are lowercased
	# Letters that follow a non-letter are upcased.
	#
	# If `keep_upper = true`, uppercase letters are not lowercased.
	#
	# When `src` is specified, this method reads from `src` instead of `self`
	# but it still writes the result to the beginning of `self`.
	# This requires `self` to have the capacity to receive all of the
	# capitalized content of `src`.
	#
	# SEE: `Char::is_letter` for the definition of a letter.
	#
	# ~~~
	# var b = new FlatBuffer.from("jAVAsCriPt")
	# b.capitalize
	# assert b == "Javascript"
	# b = new FlatBuffer.from("i am root")
	# b.capitalize
	# assert b == "I Am Root"
	# b = new FlatBuffer.from("ab_c -ab0c ab\nc")
	# b.capitalize
	# assert b == "Ab_C -Ab0C Ab\nC"
	#
	# b = new FlatBuffer.from("12345")
	# b.capitalize(src="foo")
	# assert b == "Foo45"
	#
	# b = new FlatBuffer.from("preserve my ACRONYMS")
	# b.capitalize(keep_upper=true)
	# assert b == "Preserve My ACRONYMS"
	# ~~~
	fun capitalize(keep_upper: nullable Bool, src: nullable Text) do
		src = src or else self
		var length = src.length
		if length == 0 then return
		keep_upper = keep_upper or else false

		var c = src[0].to_upper
		self[0] = c
		var prev = c
		for i in [1 .. length[ do
			prev = c
			c = src[i]
			if prev.is_letter then
				if keep_upper then
					self[i] = c
				else
					self[i] = c.to_lower
				end
			else
				self[i] = c.to_upper
			end
		end
	end

	# In Buffers, the internal sequence of character is mutable
	# Thus, `chars` can be used to modify the buffer.
	redef fun chars: Sequence[Char] is abstract

	# Appends `length` chars from `s` starting at index `from`
	#
	# ~~~
	# var b = new Buffer
	# b.append_substring("abcde", 1, 2)
	# assert b == "bc"
	# b.append_substring("vwxyz", 2, 3)
	# assert b == "bcxyz"
	# b.append_substring("ABCDE", 4, 300)
	# assert b == "bcxyzE"
	# b.append_substring("VWXYZ", 400, 1)
	# assert b == "bcxyzE"
	# ~~~
	fun append_substring(s: Text, from, length: Int) do
		if from < 0 then
			length += from
			from = 0
		end
		var ln = s.length
		if (length + from) > ln then length = ln - from
		if length <= 0 then return
		append_substring_impl(s, from, length)
	end

	# Unsafe version of `append_substring` for performance
	#
	# NOTE: Use only if sure about `from` and `length`, no checks
	# or bound recalculation is done
	fun append_substring_impl(s: Text, from, length: Int) do
		var max = from + length
		for i in [from .. max[ do add s[i]
	end

	redef fun *(i) do
		var ret = new Buffer.with_cap(byte_length * i)
		for its in [0 .. i[ do ret.append self
		return ret
	end

	redef fun insert_at(s, pos) do
		var obuf = new Buffer.with_cap(byte_length + s.byte_length)
		obuf.append_substring(self, 0, pos)
		obuf.append s
		obuf.append_substring(self, pos, length - pos)
		return obuf
	end

	# Inserts `s` at position `pos`
	#
	# ~~~
	# var b = new Buffer
	# b.append "美しい世界"
	# b.insert(" nit ", 3)
	# assert b == "美しい nit 世界"
	# ~~~
	fun insert(s: Text, pos: Int) is abstract

	# Inserts `c` at position `pos`
	#
	# ~~~
	# var b = new Buffer
	# b.append "美しい世界"
	# b.insert_char(' ', 3)
	# assert b == "美しい 世界"
	# ~~~
	fun insert_char(c: Char, pos: Int) is abstract

	# Removes a substring from `self` at position `pos`
	#
	# NOTE: `length` defaults to 1, expressed in chars
	#
	# ~~~
	# var b = new Buffer
	# b.append("美しい 世界")
	# b.remove_at(3)
	# assert b == "美しい世界"
	# b.remove_at(1, 2)
	# assert b == "美世界"
	# ~~~
	fun remove_at(pos: Int, length: nullable Int) is abstract

	redef fun reversed do
		var ret = clone
		ret.reverse
		return ret
	end

	redef fun to_upper do
		var ret = clone
		ret.upper
		return ret
	end

	redef fun to_lower do
		var ret = clone
		ret.lower
		return ret
	end

	redef fun to_snake_case do
		var ret = clone
		ret.snake_case
		return ret
	end

	# Takes a camel case `self` and converts it to snake case
	#
	# SEE: `to_snake_case`
	fun snake_case do
		if self.is_lower then return
		var prev_is_lower = false
		var prev_is_upper = false

		var i = 0
		while i < length do
			var char = chars[i]
			if char.is_lower then
				prev_is_lower = true
				prev_is_upper = false
			else if char.is_upper then
				if prev_is_lower then
					insert_char('_', i)
					i += 1
				else if prev_is_upper and i + 1 < length and self[i + 1].is_lower then
					insert_char('_', i)
					i += 1
				end
				self[i] = char.to_lower
				prev_is_lower = false
				prev_is_upper = true
			else
				prev_is_lower = false
				prev_is_upper = false
			end
			i += 1
		end
	end

	redef fun to_camel_case
	do
		var new_str = clone
		new_str.camel_case
		return new_str
	end

	# Takes a snake case `self` and converts it to camel case
	#
	# SEE: `to_camel_case`
	fun camel_case do
		if is_upper then return

		var underscore_count = 0

		var pos = 1
		while pos < length do
			var char = self[pos]
			if char == '_' then
				underscore_count += 1
			else if underscore_count > 0 then
				pos -= underscore_count
				remove_at(pos, underscore_count)
				self[pos] = char.to_upper
				underscore_count = 0
			end
			pos += 1
		end
		if underscore_count > 0 then remove_at(pos - underscore_count - 1, underscore_count)
	end

	redef fun capitalized(keep_upper) do
		if length == 0 then return self

		var buf = new Buffer.with_cap(byte_length)
		buf.capitalize(keep_upper=keep_upper, src=self)
		return buf
	end
end

# View for chars on Buffer objects, extends Sequence
# for mutation operations
private abstract class BufferCharView
	super StringCharView
	super Sequence[Char]

	redef type SELFTYPE: Buffer

end

# View for bytes on Buffer objects, extends Sequence
# for mutation operations
private abstract class BufferByteView
	super StringByteView

	redef type SELFTYPE: Buffer
end

redef class Object
	# User readable representation of `self`.
	fun to_s: String do return inspect

	# The class name of the object in CString format.
	private fun native_class_name: CString is intern

	# The class name of the object.
	#
	# ~~~
	# assert 5.class_name == "Int"
	# ~~~
	fun class_name: String do return native_class_name.to_s

	# Developer readable representation of `self`.
	# Usually, it uses the form "<CLASSNAME:#OBJECTID bla bla bla>"
	fun inspect: String
	do
		return "<{inspect_head}>"
	end

	# Return "CLASSNAME:#OBJECTID".
	# This function is mainly used with the redefinition of the inspect method
	protected fun inspect_head: String
	do
		return "{class_name}:#{object_id.to_hex}"
	end
end

redef class Bool
	# ~~~
	# assert true.to_s         == "true"
	# assert false.to_s        == "false"
	# ~~~
	redef fun to_s
	do
		if self then
			return once "true"
		else
			return once "false"
		end
	end
end

redef class Byte
	# C function to calculate the length of the `CString` to receive `self`
	private fun byte_to_s_len: Int `{
		return snprintf(NULL, 0, "0x%02x", self);
	`}

	# C function to convert an nit Int to a CString (char*)
	private fun native_byte_to_s(nstr: CString, strlen: Int) `{
		snprintf(nstr, strlen, "0x%02x", self);
	`}

	# Displayable byte in its hexadecimal form (0x..)
	#
	# ~~~
	# assert 1.to_b.to_s       == "0x01"
	# assert (-123).to_b.to_s  == "0x85"
	# ~~~
	redef fun to_s do
		var nslen = byte_to_s_len
		var ns = new CString(nslen + 1)
		ns[nslen] = 0
		native_byte_to_s(ns, nslen + 1)
		return ns.to_s_unsafe(nslen, copy=false, clean=false)
	end
end

redef class Int

	# Wrapper of strerror C function
	private fun strerror_ext: CString `{ return strerror((int)self); `}

	# Returns a string describing error number
	fun strerror: String do return strerror_ext.to_s

	# Fill `s` with the digits in base `base` of `self` (and with the '-' sign if negative).
	# assume < to_c max const of char
	private fun fill_buffer(s: Buffer, base: Int)
	do
		var n: Int
		# Sign
		if self < 0 then
			n = - self
			s.chars[0] = '-'
		else if self == 0 then
			s.chars[0] = '0'
			return
		else
			n = self
		end
		# Fill digits
		var pos = digit_count(base) - 1
		while pos >= 0 and n > 0 do
			s.chars[pos] = (n % base).to_c
			n = n / base # /
			pos -= 1
		end
	end

	# C function to calculate the length of the `CString` to receive `self`
	private fun int_to_s_len: Int `{
		return snprintf(NULL, 0, "%ld", self);
	`}

	# C function to convert an nit Int to a CString (char*)
	private fun native_int_to_s(nstr: CString, strlen: Int) `{
		snprintf(nstr, strlen, "%ld", self);
	`}

	# String representation of `self` in the given `base`
	#
	# ~~~
	# assert 15.to_base(10) == "15"
	# assert 15.to_base(16) == "f"
	# assert 15.to_base(2) == "1111"
	# assert (-10).to_base(3) == "-101"
	# ~~~
	fun to_base(base: Int): String
	do
		var l = digit_count(base)
		var s = new Buffer
		s.enlarge(l)
		for x in [0..l[ do s.add(' ')
		fill_buffer(s, base)
		return s.to_s
	end


	# return displayable int in hexadecimal
	#
	# ~~~
	# assert 1.to_hex  == "1"
	# assert (-255).to_hex  == "-ff"
	# ~~~
	fun to_hex: String do return to_base(16)
end

redef class Float
	# Pretty representation of `self`, with decimals as needed from 1 to a maximum of 3
	#
	# ~~~
	# assert 12.34.to_s       == "12.34"
	# assert (-0120.030).to_s == "-120.03"
	# assert (-inf).to_s == "-inf"
	# assert (nan).to_s == "nan"
	# ~~~
	#
	# see `to_precision` for a custom precision.
	redef fun to_s do
		var str = to_precision(3)
		return adapt_number_of_decimal(str, false)
	end

	# Return the representation of `self`, with scientific notation
	#
	# Adpat the number of decimals as needed from 1 to a maximum of 6
	# ~~~
	# assert 12.34.to_sci       == "1.234e+01"
	# assert 123.45.to_sci.to_f.to_sci  == "1.2345e+02"
	# assert 0.001234.to_sci  == "1.234e-03"
	# assert (inf).to_sci == "inf"
	# assert (nan).to_sci == "nan"
	# ~~~
	fun to_sci: String
	do
		var is_inf_or_nan = check_inf_or_nan
		if is_inf_or_nan != null then return is_inf_or_nan
		return adapt_number_of_decimal(return_from_specific_format("%e".to_cstring), true)
	end

	# Return the `string_number` with the adapted number of decimal (i.e the fonction remove the useless `0`)
	# `is_expo` it's here to specifi if the given `string_number` is in scientific notation
	private fun adapt_number_of_decimal(string_number: String, is_expo: Bool): String
	do
		# check if `self` does not need an adaptation of the decimal
		if is_inf != 0 or is_nan then return string_number
		var len = string_number.length
		var expo_value = ""
		var numeric_value = ""
		for i in [0..len-1] do
			var j = len - 1 - i
			var c = string_number.chars[j]
			if not is_expo then
				if c == '0' then
					continue
				else if c == '.' then
					numeric_value = string_number.substring( 0, j + 2)
					break
				else
					numeric_value = string_number.substring( 0, j + 1)
					break
				end
			else if c == 'e' then
				expo_value = string_number.substring( j, len - 1 )
				is_expo = false
			end
		end
		return numeric_value + expo_value
	end

	# Return a string representation of `self` in fonction if it is not a number or infinity.
	# Return `null` if `self` is not a not a number or an infinity
	private fun check_inf_or_nan: nullable String
	do
		if is_nan then return "nan"

		var isinf = self.is_inf
		if isinf == 1 then
			return "inf"
		else if isinf == -1 then
			return  "-inf"
		end
		return null
	end

	# `String` representation of `self` with the given number of `decimals`
	#
	# ~~~
	# assert 12.345.to_precision(0)    == "12"
	# assert 12.345.to_precision(3)    == "12.345"
	# assert (-12.345).to_precision(3) == "-12.345"
	# assert (-0.123).to_precision(3)  == "-0.123"
	# assert 0.999.to_precision(2)     == "1.00"
	# assert 0.999.to_precision(4)     == "0.9990"
	# ~~~
	fun to_precision(decimals: Int): String
	do
		var is_inf_or_nan = check_inf_or_nan
		if is_inf_or_nan != null then return is_inf_or_nan
		return return_from_specific_format("%.{decimals}f".to_cstring)
	end

	# Returns the hexadecimal (`String`) representation of `self` in exponential notation
	#
	# ~~~
	# assert 12.345.to_hexa_exponential_notation    == "0x1.8b0a3d70a3d71p+3"
	# assert 12.345.to_hexa_exponential_notation.to_f == 12.345
	# ~~~
	fun to_hexa_exponential_notation: String
	do
		return return_from_specific_format("%a".to_cstring)
	end

	# Return the representation of `self`, with the specific given c `format`.
	private fun return_from_specific_format(format: CString): String
	do
		var size = to_precision_size_with_format(format)
		var cstr = new CString(size + 1)
		to_precision_fill_with_format(format, size + 1, cstr)
		return cstr.to_s_unsafe(byte_length = size, copy = false)
	end

	# The lenght of `self` in the specific given c `format`
	private fun to_precision_size_with_format(format: CString): Int`{
		return snprintf(NULL, 0, format, self);
	`}

	# Fill `cstr` with `self` in the specific given c `format`
	private fun to_precision_fill_with_format(format: CString, size: Int, cstr: CString) `{
		snprintf(cstr, size, format, self);
	`}
end

redef class Char

	# Returns a sequence with the UTF-8 bytes of `self`
	#
	# ~~~
	# assert 'a'.bytes == [0x61]
	# assert 'ま'.bytes == [0xE3, 0x81, 0xBE]
	# ~~~
	fun bytes: SequenceRead[Int] do return to_s.bytes

	# Is `self` an UTF-16 surrogate pair ?
	fun is_surrogate: Bool do
		var cp = code_point
		return cp >= 0xD800 and cp <= 0xDFFF
	end

	# Is `self` a UTF-16 high surrogate ?
	fun is_hi_surrogate: Bool do
		var cp = code_point
		return cp >= 0xD800 and cp <= 0xDBFF
	end

	# Is `self` a UTF-16 low surrogate ?
	fun is_lo_surrogate: Bool do
		var cp = code_point
		return cp >= 0xDC00 and cp <= 0xDFFF
	end

	# Length of `self` in a UTF-8 String
	fun u8char_len: Int do
		var c = self.code_point
		if c < 0x80 then return 1
		if c <= 0x7FF then return 2
		if c <= 0xFFFF then return 3
		if c <= 0x10FFFF then return 4
		# Bad character format
		return 1
	end

	# ~~~
	# assert 'x'.to_s    == "x"
	# ~~~
	redef fun to_s do
		var ln = u8char_len
		var ns = new CString(ln + 1)
		u8char_tos(ns, ln)
		return ns.to_s_unsafe(ln, copy=false, clean=false)
	end

	# Returns `self` escaped to UTF-16
	#
	# i.e. Represents `self`.`code_point` using UTF-16 codets escaped
	# with a `\u`
	#
	# ~~~
	# assert 'A'.escape_to_utf16 == "\\u0041"
	# assert 'è'.escape_to_utf16 == "\\u00e8"
	# assert 'あ'.escape_to_utf16 == "\\u3042"
	# assert '𐏓'.escape_to_utf16 == "\\ud800\\udfd3"
	# ~~~
	fun escape_to_utf16: String do
		var cp = code_point
		var buf: Buffer
		if cp < 0xD800 or (cp >= 0xE000 and cp <= 0xFFFF) then
			buf = new Buffer.with_cap(6)
			buf.append("\\u0000")
			var hx = cp.to_hex
			var outid = 5
			for i in hx.chars.reverse_iterator do
				buf[outid] = i
				outid -= 1
			end
		else
			buf = new Buffer.with_cap(12)
			buf.append("\\u0000\\u0000")
			var lo = (((cp - 0x10000) & 0x3FF) + 0xDC00).to_hex
			var hi = ((((cp - 0x10000) & 0xFFC00) >> 10) + 0xD800).to_hex
			var out = 2
			for i in hi do
				buf[out] = i
				out += 1
			end
			out = 8
			for i in lo do
				buf[out] = i
				out += 1
			end
		end
		return buf.to_s
	end

	private fun u8char_tos(r: CString, len: Int) `{
		r[len] = '\0';
		switch(len){
			case 1:
				r[0] = self;
				break;
			case 2:
				r[0] = 0xC0 | ((self & 0x7C0) >> 6);
				r[1] = 0x80 | (self & 0x3F);
				break;
			case 3:
				r[0] = 0xE0 | ((self & 0xF000) >> 12);
				r[1] = 0x80 | ((self & 0xFC0) >> 6);
				r[2] = 0x80 | (self & 0x3F);
				break;
			case 4:
				r[0] = 0xF0 | ((self & 0x1C0000) >> 18);
				r[1] = 0x80 | ((self & 0x3F000) >> 12);
				r[2] = 0x80 | ((self & 0xFC0) >> 6);
				r[3] = 0x80 | (self & 0x3F);
				break;
		}
	`}

	# Returns true if the char is a numerical digit
	#
	# ~~~
	# assert '0'.is_numeric
	# assert '9'.is_numeric
	# assert not 'a'.is_numeric
	# assert not '?'.is_numeric
	# ~~~
	#
	# FIXME: Works on ASCII-range only
	fun is_numeric: Bool
	do
		return self >= '0' and self <= '9'
	end

	# Returns true if the char is an alpha digit
	#
	# ~~~
	# assert 'a'.is_alpha
	# assert 'Z'.is_alpha
	# assert not '0'.is_alpha
	# assert not '?'.is_alpha
	# ~~~
	#
	# FIXME: Works on ASCII-range only
	fun is_alpha: Bool
	do
		return (self >= 'a' and self <= 'z') or (self >= 'A' and self <= 'Z')
	end

	# Is `self` an hexadecimal digit ?
	#
	# ~~~
	# assert 'A'.is_hexdigit
	# assert not 'G'.is_hexdigit
	# assert 'a'.is_hexdigit
	# assert not 'g'.is_hexdigit
	# assert '5'.is_hexdigit
	# ~~~
	fun is_hexdigit: Bool do return (self >= '0' and self <= '9') or (self >= 'A' and self <= 'F') or
					(self >= 'a' and self <= 'f')

	# Returns true if the char is an alpha or a numeric digit
	#
	# ~~~
	# assert 'a'.is_alphanumeric
	# assert 'Z'.is_alphanumeric
	# assert '0'.is_alphanumeric
	# assert '9'.is_alphanumeric
	# assert not '?'.is_alphanumeric
	# ~~~
	#
	# FIXME: Works on ASCII-range only
	fun is_alphanumeric: Bool
	do
		return self.is_numeric or self.is_alpha
	end

	# Returns `self` to its int value
	#
	# REQUIRE: `is_hexdigit`
	fun from_hex: Int do
		if self >= '0' and self <= '9' then return code_point - 0x30
		if self >= 'A' and self <= 'F' then return code_point - 0x37
		if self >= 'a' and self <= 'f' then return code_point - 0x57
		# Happens if self is not a hexdigit
		assert self.is_hexdigit
		# To make flow analysis happy
		abort
	end
end

redef class Collection[E]
	# String representation of the content of the collection.
	#
	# The standard representation is the list of elements separated with commas.
	#
	# ~~~
	# assert [1,2,3].to_s == "[1,2,3]"
	# assert [1..3].to_s  == "[1,2,3]"
	# assert (new Array[Int]).to_s == "[]" # empty collection
	# ~~~
	#
	# Subclasses may return a more specific string representation.
	redef fun to_s
	do
		return "[" + join(",") + "]"
	end

	# Concatenate elements without separators
	#
	# ~~~
	# assert [1,2,3].plain_to_s == "123"
	# assert [11..13].plain_to_s  == "111213"
	# assert (new Array[Int]).plain_to_s == "" # empty collection
	# ~~~
	fun plain_to_s: String
	do
		var s = new Buffer
		for e in self do if e != null then s.append(e.to_s)
		return s.to_s
	end

	# Concatenate and separate each elements with `separator`.
	#
	# Only concatenate if `separator == null`.
	#
	# ~~~
	# assert [1, 2, 3].join(":")    == "1:2:3"
	# assert [1..3].join(":")       == "1:2:3"
	# assert [1..3].join            == "123"
	# ~~~
	#
	# if `last_separator` is given, then it is used to separate the last element.
	#
	# ~~~
	# assert [1, 2, 3, 4].join(", ", " and ")    == "1, 2, 3 and 4"
	# ~~~
	fun join(separator: nullable Text, last_separator: nullable Text): String
	do
		if is_empty then return ""

		var s = new Buffer # Result

		# Concat first item
		var i = iterator
		var e = i.item
		if e != null then s.append(e.to_s)

		if last_separator == null then last_separator = separator

		# Concat other items
		i.next
		while i.is_ok do
			e = i.item
			i.next
			if i.is_ok then
				if separator != null then s.append(separator)
			else
				if last_separator != null then s.append(last_separator)
			end
			if e != null then s.append(e.to_s)
		end
		return s.to_s
	end
end

redef class Map[K,V]
	# Concatenate couples of key value.
	# Key and value are separated by `couple_sep`.
	# Couples are separated by `sep`.
	#
	# ~~~
	# var m = new HashMap[Int, String]
	# m[1] = "one"
	# m[10] = "ten"
	# assert m.join("; ", "=") == "1=one; 10=ten"
	# ~~~
	fun join(sep, couple_sep: String): String is abstract
end

redef class Sys
	private var args_cache: nullable Sequence[String] = null

	# The arguments of the program as given by the OS
	fun program_args: Sequence[String]
	do
		if _args_cache == null then init_args
		return _args_cache.as(not null)
	end

	# The name of the program as given by the OS
	fun program_name: String
	do
		return native_argv(0).to_s
	end

	# Initialize `program_args` with the contents of `native_argc` and `native_argv`.
	private fun init_args
	do
		var argc = native_argc
		var args = new Array[String].with_capacity(0)
		var i = 1
		while i < argc do
			args[i-1] = native_argv(i).to_s
			i += 1
		end
		_args_cache = args
	end

	# First argument of the main C function.
	private fun native_argc: Int is intern

	# Second argument of the main C function.
	private fun native_argv(i: Int): CString is intern
end

# Comparator that efficienlty use `to_s` to compare things
#
# The comparaison call `to_s` on object and use the result to order things.
#
# ~~~
# var a = [1, 2, 3, 10, 20]
# (new CachedAlphaComparator).sort(a)
# assert a == [1, 10, 2, 20, 3]
# ~~~
#
# Internally the result of `to_s` is cached in a HashMap to counter
# uneficient implementation of `to_s`.
#
# Note: it caching is not usefull, see `alpha_comparator`
class CachedAlphaComparator
	super Comparator
	redef type COMPARED: Object

	private var cache = new HashMap[Object, String]

	private fun do_to_s(a: Object): String do
		if cache.has_key(a) then return cache[a]
		var res = a.to_s
		cache[a] = res
		return res
	end

	redef fun compare(a, b) do
		return do_to_s(a) <=> do_to_s(b)
	end
end

# see `alpha_comparator`
private class AlphaComparator
	super Comparator
	redef fun compare(a, b) do
		if a == b then return 0
		if a == null then return -1
		if b == null then return 1
		return a.to_s <=> b.to_s
	end
end

# Stateless comparator that naively use `to_s` to compare things.
#
# Note: the result of `to_s` is not cached, thus can be invoked a lot
# on a single instace. See `CachedAlphaComparator` as an alternative.
#
# ~~~
# var a = [1, 2, 3, 10, 20]
# alpha_comparator.sort(a)
# assert a == [1, 10, 2, 20, 3]
# ~~~
fun alpha_comparator: Comparator do return once new AlphaComparator

# The arguments of the program as given by the OS
fun args: Sequence[String]
do
	return sys.program_args
end

redef class CString

	# Get a `String` from the data at `self` (with unsafe options)
	#
	# The default behavior is the safest and equivalent to `to_s`.
	#
	# Options:
	#
	# * Set `byte_length` to the number of bytes to use as data.
	#   Otherwise, this method searches for a terminating null byte.
	#
	# * Set `char_length` to the number of Unicode character in the string.
	#   Otherwise, the data is read to count the characters.
	#   Ignored if `clean == true`.
	#
	# * If `copy == true`, the default, copies the data at `self` in the
	#   Nit GC allocated memory. Otherwise, the return may still point to
	#   the data at `self`.
	#
	# * If `clean == true`, the default, the string is cleaned of invalid UTF-8
	#   characters. If cleaning is necessary, the data is copied into Nit GC
	#   managed memory, whether or not `copy == true`.
	#   Don't clean only when the data has already been verified as valid UTF-8,
	#   other library services rely on UTF-8 compliant characters.
	fun to_s_unsafe(byte_length, char_length: nullable Int, copy, clean: nullable Bool): String is abstract

	# Retro-compatibility service use by execution engines
	#
	# TODO remove this method at the next c_src regen.
	private fun to_s_full(byte_length, char_length: Int): String do return to_s_unsafe(byte_length, char_length, false, false)

	# Copies the content of `src` to `self`
	#
	# NOTE: `self` must be large enough to contain `self.byte_length` bytes
	fun fill_from(src: Text) do src.copy_to_native(self, src.byte_length, 0, 0)
end

redef class NativeArray[E]
	# Join all the elements using `to_s`
	#
	# REQUIRE: `self isa NativeArray[String]`
	# REQUIRE: all elements are initialized
	fun native_to_s: String is abstract
end
lib/core/text/abstract_text.nit:11,1--2568,3