Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
- module Control.Category
- type Format m = Cokleisli ((->) m)
- printfWith :: (m -> r) -> Format m r b -> b
- sprintf :: Format m m b -> b
- c :: Monoid m => m -> Format m a a
- i :: Format m a (m -> a)
- spliceWith :: Monoid m => (t -> m) -> Format m a (t -> a)
- s :: (Monoid s, IsString s, Show t) => Format s a (t -> a)
- generalizeString :: (IsString s, Monoid s) => Format String a b -> Format s a b
- intAtBase :: (Real t, Integral t, Show t, Monoid s, IsString s) => t -> (Int -> Char) -> Format s a (t -> a)
- hex :: (Integral t, Show t, Monoid s, IsString s) => Format s a (t -> a)
- oct :: (Integral t, Show t, Monoid s, IsString s) => Format s a (t -> a)
- eFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a)
- fFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a)
- gFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a)
- push :: Monoid m => t -> Format m (t -> a) a
- dup :: Monoid m => Format m (t -> t -> a) (t -> a)
- swap :: Monoid m => Format m (t -> t' -> a) (t' -> t -> a)
- skip :: Monoid m => Format m (t -> a) (t' -> t -> a)
- apply :: Monoid m => (u -> v) -> Format m (v -> a) (u -> a)
- apply2 :: Monoid m => (u -> v -> w) -> Format m (w -> a) (u -> v -> a)
Documentation
module Control.Category
printfWith :: (m -> r) -> Format m r b -> b Source
You should regard a value of type Format m a b
as something which explains how to write
some element of the monoid m
(a "string" for our purposes), and which will change the type
of printf from a
to b
. For instance, something which adds a responsibility to provide an
additional argument of type t
might have type Format m a (t -> a)
, while a formatter which
somehow absolves you of that responsibility would have type Format m (t -> a) a
.
We can apply this to something like putStrLn to get a function for formatted printing.
Typically you'll have r = IO ()
, but that needn't be the case.
sprintf :: Format m m b -> b Source
If you just want to build a string / element of your monoid, we have sprintf = printfWith id
spliceWith :: Monoid m => (t -> m) -> Format m a (t -> a) Source
Given a way to turn a value of type t into a string, this builds a formatter which demands an additional argument of type t and splices it in.
generalizeString :: (IsString s, Monoid s) => Format String a b -> Format s a b Source
Generalizes the string type that a formatter uses by applying fromString internally.
intAtBase :: (Real t, Integral t, Show t, Monoid s, IsString s) => t -> (Int -> Char) -> Format s a (t -> a) Source
Show an integral value using the given base, and using the provided function to determine how to display individual digits.
hex :: (Integral t, Show t, Monoid s, IsString s) => Format s a (t -> a) Source
Show an integral value in hexadecimal.
oct :: (Integral t, Show t, Monoid s, IsString s) => Format s a (t -> a) Source
Show an integral value in octal.
eFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a) Source
Show a floating point value in exponential format. (e.g. 2.45e2, -1.5e-3)
If digs
is Nothing, the value is shown to full precision, if it is Just d then at most
d digits after the decimal point are shown.
fFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a) Source
Show a floating point value in standard decimal format. (e.g. 245000, -0.0015)
If digs
is Nothing, the value is shown to full precision, if it is Just d then at most
d digits after the decimal point are shown.
gFloat :: (RealFloat t, Monoid s, IsString s) => Maybe Int -> Format s a (t -> a) Source
Show a floating point value using standard decimal notation for arguments whose absolute
value lies between 0.1 and 9,999,999, and scientific notation otherwise.
If digs
is Nothing, the value is shown to full precision, if it is Just d then at most
d digits after the decimal point are shown.
push :: Monoid m => t -> Format m (t -> a) a Source
We can use arr
from the Arrow instance for Cokleisli w to produce formatters
that manipulate the stack without printing. That is, we have
arr :: (Monoid m) => (s -> s') -> Format m s s'
Push an argument onto the stack to be consumed by subsequent formatters.
dup :: Monoid m => Format m (t -> t -> a) (t -> a) Source
Duplicate an argument on the stack, making it available twice.
swap :: Monoid m => Format m (t -> t' -> a) (t' -> t -> a) Source
Swap the next two arguments on the stack.