packages feed

literatex-0.1.0.0: src/LiterateX/Types/SourceFormat.hs

------------------------------------------------------------------------------
-- |
-- Module      : LiterateX.Types.SourceFormat
-- Description : source format type
-- Copyright   : Copyright (c) 2021 Travis Cardwell
-- License     : MIT
------------------------------------------------------------------------------

{-# LANGUAGE LambdaCase #-}

module LiterateX.Types.SourceFormat
  ( -- * Type
    SourceFormat(..)
    -- * API
  , describe
  , list
  ) where

-- https://hackage.haskell.org/package/ttc
import qualified Data.TTC as TTC

------------------------------------------------------------------------------
-- $Type

-- | Source format
--
-- This sum type defines the supported source formats.
--
-- @since 0.0.1.0
data SourceFormat
  = DoubleDash       -- ^ \-- comments
  | DoubleSlash      -- ^ // comments
  | Hash             -- ^ # comments
  | LispSemicolons   -- ^ Lisp semicolon comments
  | LiterateHaskell  -- ^ literate Haskell
  | Percent          -- ^ % comments
  deriving (Bounded, Enum, Eq, Ord, Show)

instance TTC.Parse SourceFormat where
  parse = TTC.parseEnum' "source format" True False

instance TTC.Render SourceFormat where
  render = TTC.fromS . \case
    DoubleDash      -> "ddash"
    DoubleSlash     -> "dslash"
    Hash            -> "hash"
    LispSemicolons  -> "lisp"
    LiterateHaskell -> "lhs"
    Percent         -> "percent"

------------------------------------------------------------------------------
-- $API

-- | Get a description of a source format
--
-- @since 0.0.1.0
describe :: SourceFormat -> String
describe = \case
    DoubleDash      -> "-- comments"
    DoubleSlash     -> "// comments"
    Hash            -> "# comments"
    LispSemicolons  -> "Lisp semicolon comments"
    LiterateHaskell -> "literate Haskell"
    Percent         -> "% comments"

------------------------------------------------------------------------------

-- | List of all supported source formats
--
-- @since 0.0.1.0
list :: [SourceFormat]
list = [minBound ..]