packages feed

mello-0.2.0: src/Mello/Text.hs

module Mello.Text
  ( Brace (..)
  , openBraceChar
  , closeBraceChar
  , readOpenBrace
  , readCloseBrace
  , isSymStart
  , isSymCont
  , isListStart
  , isListEnd
  , isCharStart
  , isStringStart
  , isQuoteStart
  , isUnquoteStart
  , isCommentStart
  , isDocCont
  , isNumStart
  , isAtomStart
  )
where

import Data.Char (isControl, isDigit, isSpace)

data Brace = BraceParen | BraceCurly | BraceSquare
  deriving stock (Eq, Ord, Show, Enum, Bounded)

openBraceChar :: Brace -> Char
openBraceChar = \case
  BraceParen -> '('
  BraceCurly -> '{'
  BraceSquare -> '['

closeBraceChar :: Brace -> Char
closeBraceChar = \case
  BraceParen -> ')'
  BraceCurly -> '}'
  BraceSquare -> ']'

readOpenBrace :: Char -> Maybe Brace
readOpenBrace = \case
  '(' -> Just BraceParen
  '{' -> Just BraceCurly
  '[' -> Just BraceSquare
  _ -> Nothing

readCloseBrace :: Char -> Maybe Brace
readCloseBrace = \case
  ')' -> Just BraceParen
  '}' -> Just BraceCurly
  ']' -> Just BraceSquare
  _ -> Nothing

isSymStart
  , isSymCont
  , isListStart
  , isListEnd
  , isCharStart
  , isStringStart
  , isQuoteStart
  , isUnquoteStart
  , isCommentStart
  , isDocCont
  , isNumStart
  , isAtomStart
    :: Char -> Bool
isSymStart c = not (isDigit c) && isSymCont c
isSymCont c =
  not $
    isControl c
      || isSpace c
      || isCommentStart c
      || isListStart c
      || isListEnd c
      || isStringStart c
      || isCharStart c
      || isQuoteStart c
      || isUnquoteStart c
      || isDigit c
isListStart c = c == '(' || c == '{' || c == '['
isListEnd c = c == ')' || c == '}' || c == ']'
isCharStart c = c == '\''
isStringStart c = c == '\"'
isQuoteStart c = c == '`'
isUnquoteStart c = c == ','
isCommentStart c = c == ';'
isDocCont c = c == '|'
isNumStart c = isDigit c || c == '-'
isAtomStart c =
  isSymStart c
    || isNumStart c
    || isStringStart c
    || isCharStart c