Packages

The Phi Programming Language

Current section

Files

Jump to
phi priv Data Enum.phi
Raw

priv/Data/Enum.phi

-----------------------------------------------------------------------------
-- |
-- Module : Data.Enum
-- Copyright : (c) 2020-2021 EMQ Technologies Co., Ltd.
-- License : BSD-style (see the LICENSE file)
--
-- Maintainer : Feng Lee, feng@emqx.io
-- Yang M, yangm@emqx.io
-- Stability : experimental
-- Portability : portable
--
-- The Enum typeclass.
--
-----------------------------------------------------------------------------
module Data.Enum
( class Enum
, succ
, pred
, range
, rangeStep
) where
import Data.Function (error)
import Data.Eq ((==))
class Enum a where
succ :: a -> a
pred :: a -> a
range :: a -> a -> [a]
rangeStep :: a -> a -> a -> [a]
instance Enum Char where
succ = enumCharSucc
pred = enumCharPred
range = enumCharRange
rangeStep = enumCharRangeStep
foreign import enumCharSucc :: Char -> Char
foreign import enumCharPred :: Char -> Char
foreign import enumCharRange :: Char -> Char -> [Char]
foreign import enumCharRangeStep :: Char -> Char -> Char -> [Char]
instance Enum Integer where
succ = enumIntegerSucc
pred = enumIntegerPred
range = enumIntegerRange
rangeStep = enumIntegerRangeStep
foreign import enumIntegerSucc :: Integer -> Integer
foreign import enumIntegerPred :: Integer -> Integer
foreign import enumIntegerRange :: Integer -> Integer -> [Integer]
foreign import enumIntegerRangeStep :: Integer -> Integer -> Integer -> [Integer]
instance Enum Boolean where
succ false = true
succ true = error "bad argument"
pred false = error "bad argument"
pred true = false
range x y | x == y = [x]
range true false = []
range x y = [x, y]
rangeStep x y _ | x == y = error "bad argument"
rangeStep x _ y | x == y = [x]
rangeStep x _ y = [x, y]
instance Enum Float where
succ = enumFloatSucc
pred = enumFloatPred
range = enumFloatRange
rangeStep = enumFloatRangeStep
foreign import enumFloatSucc :: Float -> Float
foreign import enumFloatPred :: Float -> Float
foreign import enumFloatRange :: Float -> Float -> [Float]
foreign import enumFloatRangeStep :: Float -> Float -> Float -> [Float]