Copyright | (c) 2018-2020 Kowainik |
---|---|
License | MIT |
Maintainer | Kowainik <xrom.xkov@gmail.com> |
Stability | Experimental |
Portability | Portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Mini bounded-enum
framework inside relude
.
Since: 0.1.0
Synopsis
- universe :: (Bounded a, Enum a) => [a]
- universeNonEmpty :: forall a. (Bounded a, Enum a, Eq a) => NonEmpty a
- inverseMap :: forall a k. (Bounded a, Enum a, Ord k) => (a -> k) -> k -> Maybe a
- next :: (Eq a, Bounded a, Enum a) => a -> a
- prev :: (Eq a, Bounded a, Enum a) => a -> a
- safeToEnum :: forall a. (Bounded a, Enum a) => Int -> Maybe a
Documentation
universe :: (Bounded a, Enum a) => [a] Source #
Returns all values of some Bounded
Enum
in ascending order.
>>>
universe :: [Bool]
[False,True]
>>>
universe @Ordering
[LT,EQ,GT]
>>>
data TrafficLight = Red | Blue | Green deriving (Show, Enum, Bounded)
>>>
universe :: [TrafficLight]
[Red,Blue,Green]
>>>
data Singleton = Singleton deriving (Show, Enum, Bounded)
>>>
universe @Singleton
[Singleton]
Since: 0.1.0
universeNonEmpty :: forall a. (Bounded a, Enum a, Eq a) => NonEmpty a Source #
Like universe
, but returns NonEmpty
list of some enumeration
>>>
universeNonEmpty :: NonEmpty Bool
False :| [True]
>>>
universeNonEmpty @Ordering
LT :| [EQ,GT]
>>>
data TrafficLight = Red | Blue | Green deriving (Show, Eq, Enum, Bounded)
>>>
universeNonEmpty :: NonEmpty TrafficLight
Red :| [Blue,Green]
>>>
data Singleton = Singleton deriving (Show, Eq, Enum, Bounded)
>>>
universeNonEmpty @Singleton
Singleton :| []
Since: 0.7.0.0
inverseMap :: forall a k. (Bounded a, Enum a, Ord k) => (a -> k) -> k -> Maybe a Source #
inverseMap f
creates a function that is the inverse of a given function
f
. It does so by constructing Map
internally for each value f a
. The
implementation makes sure that the Map
is constructed only once and then
shared for every call.
Memory usage note: don't inverse functions that have types like Int
as their result. In this case the created Map
will have huge size.
The complexity of reversed mapping is \(\mathcal{O}(\log n)\).
Performance note: make sure to specialize monomorphic type of your functions
that use inverseMap
to avoid Map
reconstruction.
One of the common inverseMap
use-case is inverting the show
or a show
-like
function.
>>>
data Color = Red | Green | Blue deriving (Show, Enum, Bounded)
>>>
parse = inverseMap show :: String -> Maybe Color
>>>
parse "Red"
Just Red>>>
parse "Black"
Nothing
Correctness note: inverseMap
expects injective function as its argument,
i.e. the function must map distinct arguments to distinct values.
Typical usage of this function looks like this:
data GhcVer = Ghc802 | Ghc822 | Ghc844 | Ghc865 | Ghc881 deriving (Eq
,Ord
,Show
,Enum
,Bounded
) showGhcVer :: GhcVer ->Text
showGhcVer = \case Ghc802 -> "8.0.2" Ghc822 -> "8.2.2" Ghc844 -> "8.4.4" Ghc865 -> "8.6.5" Ghc881 -> "8.8.1" parseGhcVer ::Text
->Maybe
GhcVer parseGhcVer =inverseMap
showGhcVer
Since: 0.1.1