module Basics where {-| Tons of useful functions that get imported by default. # Equality @docs (==), (/=) # Comparison These functions only work on `comparable` types. This includes numbers, characters, strings, lists of comparable things, and tuples of comparable things. Note that tuples with 7 or more elements are not comparable; why are your tuples so big? @docs (<), (>), (<=), (>=), max, min, Order, compare # Booleans @docs not, (&&), (||), xor, otherwise # Mathematics @docs (+), (-), (*), (/), (^), (//), rem, (%), negate, abs, sqrt, clamp, logBase, e # Trigonometry @docs pi, cos, sin, tan, acos, asin, atan, atan2 # Number Conversions @docs round, floor, ceiling, truncate, toFloat # Angle Conversions All angle conversions result in “standard Elm angles” which happen to be radians. @docs degrees, radians, turns # Polar Coordinates @docs toPolar, fromPolar # Floating Point Checks @docs isNaN, isInfinite # Strings and Lists @docs toString, (++) # Tuples @docs fst, snd # Higher-Order Helpers @docs identity, always, (<|), (|>), (<<), (>>), flip, curry, uncurry -} import Native.Basics import Native.Ports import Native.Show import Native.Utils import Native.Runtime {-| Convert radians to standard Elm angles (radians). -} radians : Float -> Float radians t = t {-| Convert degrees to standard Elm angles (radians). -} degrees : Float -> Float degrees = Native.Basics.degrees {-| Convert turns to standard Elm angles (radians). One turn is equal to 360°. -} turns : Float -> Float turns = Native.Basics.turns {-| Convert polar coordinates (r,θ) to cartesian coordinates (x,y). -} fromPolar : (Float,Float) -> (Float,Float) fromPolar = Native.Basics.fromPolar {-| Convert cartesian coordinates (x,y) to polar coordinates (r,θ). -} toPolar : (Float,Float) -> (Float,Float) toPolar = Native.Basics.toPolar (+) : number -> number -> number (+) = Native.Basics.add (-) : number -> number -> number (-) = Native.Basics.sub (*) : number -> number -> number (*) = Native.Basics.mul {-| Floating point division. -} (/) : Float -> Float -> Float (/) = Native.Basics.floatDiv infixl 6 + infixl 6 - infixl 7 * infixl 7 / infixl 8 ^ infixl 7 // infixl 7 % infixl 7 `rem` {-| Integer division. The remainder is discarded. -} (//) : Int -> Int -> Int (//) = Native.Basics.div {-| Find the remainder after dividing one number by another. 7 `rem` 2 == 1 -1 `rem` 4 == -1 -} rem : Int -> Int -> Int rem = Native.Basics.rem {-| Perform [modular arithmetic](http://en.wikipedia.org/wiki/Modular_arithmetic). 7 % 2 == 1 -1 % 4 == 3 -} (%) : Int -> Int -> Int (%) = Native.Basics.mod {-| Exponentiation 3^2 == 9` -} (^) : number -> number -> number (^) = Native.Basics.exp cos : Float -> Float cos = Native.Basics.cos sin : Float -> Float sin = Native.Basics.sin tan : Float -> Float tan = Native.Basics.tan acos : Float -> Float acos = Native.Basics.acos asin : Float -> Float asin = Native.Basics.asin {-| You probably do not want to use this. It takes `(y/x)` as the argument, so there is no way to know whether the negative signs comes from the `y` or `x`. Thus, the resulting angle is always between π/2 and -π/2 (in quadrants I and IV). You probably want to use `atan2` instead. -} atan : Float -> Float atan = Native.Basics.atan {-| This helps you find the angle of a cartesian coordinate. You will almost certainly want to use this instead of `atan`. So `atan2 y x` computes *atan(y/x)* but also keeps track of which quadrant the angle should really be in. The result will be between π and -π, giving you the full range of angles. -} atan2 : Float -> Float -> Float atan2 = Native.Basics.atan2 {-| Take the square root of a number. -} sqrt : Float -> Float sqrt = Native.Basics.sqrt {-| Negate a number. negate 42 == -42 negate -42 == 42 negate 0 == 0 -} negate : number -> number negate = Native.Basics.negate {-| Take the absolute value of a number. -} abs : number -> number abs = Native.Basics.abs {-| Calculate the logarithm of a number with a given base. logBase 10 100 == 2 logBase 2 256 == 8 -} logBase : Float -> Float -> Float logBase = Native.Basics.logBase {-| Clamps a number within a given range. With the expression `clamp 100 200 x` the results are as follows: 100 if x < 100 x if 100 <= x < 200 200 if 200 <= x -} clamp : number -> number -> number -> number clamp = Native.Basics.clamp {-| An approximation of pi. -} pi : Float pi = Native.Basics.pi {-| An approximation of e. -} e : Float e = Native.Basics.e (==) : a -> a -> Bool (==) = Native.Basics.eq (/=) : a -> a -> Bool (/=) = Native.Basics.neq (<) : comparable -> comparable -> Bool (<) = Native.Basics.lt (>) : comparable -> comparable -> Bool (>) = Native.Basics.gt (<=) : comparable -> comparable -> Bool (<=) = Native.Basics.le (>=) : comparable -> comparable -> Bool (>=) = Native.Basics.ge infix 4 == infix 4 /= infix 4 < infix 4 > infix 4 <= infix 4 >= {-| Compare any two comparable values. Comparable values include `String`, `Char`, `Int`, `Float`, `Time`, or a list or tuple containing comparable values. These are also the only values that work as `Dict` keys or `Set` members. -} compare : comparable -> comparable -> Order compare = Native.Basics.compare {-| Represents the relative ordering of two things. The relations are less than, equal to, and greater than. -} type Order = LT | EQ | GT {-| Find the smaller of two comparables. -} min : comparable -> comparable -> comparable min = Native.Basics.min {-| Find the larger of two comparables. -} max : comparable -> comparable -> comparable max = Native.Basics.max {-| The logical AND operator. `True` if both inputs are `True`. This operator short-circuits to `False` if the first argument is `False`. -} (&&) : Bool -> Bool -> Bool (&&) = Native.Basics.and {-| The logical OR operator. `True` if one or both inputs are `True`. This operator short-circuits to `True` if the first argument is True. -} (||) : Bool -> Bool -> Bool (||) = Native.Basics.or infixr 3 && infixr 2 || {-| The exclusive-or operator. `True` if exactly one input is `True`. -} xor : Bool -> Bool -> Bool xor = Native.Basics.xor {-| Negate a boolean value. not True == False not False == True -} not : Bool -> Bool not = Native.Basics.not {-| Equal to `True`. Useful as the last case of a multi-way-if. -} otherwise : Bool otherwise = True -- Conversions {-| Round a number to the nearest integer. -} round : Float -> Int round = Native.Basics.round {-| Truncate a number, rounding towards zero. -} truncate : Float -> Int truncate = Native.Basics.truncate {-| Floor function, rounding down. -} floor : Float -> Int floor = Native.Basics.floor {-| Ceiling function, rounding up. -} ceiling : Float -> Int ceiling = Native.Basics.ceiling {-| Convert an integer into a float. -} toFloat : Int -> Float toFloat = Native.Basics.toFloat {- | Determine whether a float is an undefined or unrepresentable number. NaN stands for *not a number* and it is [a standardized part of floating point numbers](http://en.wikipedia.org/wiki/NaN). isNaN (0/0) == True isNaN (sqrt -1) == True isNaN (1/0) == False -- infinity is a number isNaN 1 == False -} isNaN : Float -> Bool isNaN = Native.Basics.isNaN {- | Determine whether a float is positive or negative infinity. isInfinite (0/0) == False isInfinite (sqrt -1) == False isInfinite (1/0) == True isInfinite 1 == False Notice that NaN is not infinite! For float `n` to be finite implies that `not (isInfinite n || isNaN n)` evaluates to `True`. -} isInfinite : Float -> Bool isInfinite = Native.Basics.isInfinite {-| Turn any kind of value into a string. toString 42 == "42" toString [1,2] == "[1,2]" -} toString : a -> String toString = Native.Show.toString {-| Put two appendable things together. This includes strings, lists, and text. "hello" ++ "world" == "helloworld" [1,1,2] ++ [3,5,8] == [1,1,2,3,5,8] -} (++) : appendable -> appendable -> appendable (++) = Native.Utils.append infixr 5 ++ -- Function Helpers {-| Function composition, passing results along in the suggested direction. For example, the following code checks if the square root of a number is odd: not << isEven << sqrt You can think of this operator as equivalent to the following: (g << f) == (\x -> g (f x)) So our example expands out to something like this: \n -> not (isEven (sqrt n)) -} (<<) : (b -> c) -> (a -> b) -> (a -> c) (<<) g f x = g (f x) {-| Function composition, passing results along in the suggested direction. For example, the following code checks if the square root of a number is odd: sqrt >> isEven >> not This direction of function composition seems less pleasant than `(<<)` which reads nicely in expressions like: `filter (not << isRegistered) students` -} (>>) : (a -> b) -> (b -> c) -> (a -> c) (>>) f g x = g (f x) {-| Forward function application `x |> f == f x`. This function is useful for avoiding parenthesis and writing code in a more natural way. Consider the following code to create a pentagon: scale 2 (move (10,10) (filled blue (ngon 5 30))) This can also be written as: ngon 5 30 |> filled blue |> move (10,10) |> scale 2 -} (|>) : a -> (a -> b) -> b x |> f = f x {-| Backward function application `f <| x == f x`. This function is useful for avoiding parenthesis. Consider the following code to create a text element: leftAligned (monospace (fromString "code")) This can also be written as: leftAligned << monospace <| fromString "code" -} (<|) : (a -> b) -> a -> b f <| x = f x infixr 9 << infixl 9 >> infixr 0 <| infixl 0 |> {-| Given a value, returns exactly the same value. This is called [the identity function](http://en.wikipedia.org/wiki/Identity_function). -} identity : a -> a identity x = x {-| Create a [constant function](http://en.wikipedia.org/wiki/Constant_function), a function that *always* returns the same value regardless of what input you give. It is defined as: always a b = a It totally ignores the second argument, so `always 42` is a function that always returns 42. When you are dealing with higher-order functions, this comes in handy more often than you might expect. For example, creating a zeroed out list of length ten would be: map (always 0) [0..9] -} always : a -> b -> a always a _ = a {-| Given a 2-tuple, returns the first value. -} fst : (a,b) -> a fst (a,_) = a {-| Given a 2-tuple, returns the second value. -} snd : (a,b) -> b snd (_,b) = b {-| Flip the order of the first two arguments to a function. -} flip : (a -> b -> c) -> (b -> a -> c) flip f b a = f a b {-| Change how arguments are passed to a function. This splits paired arguments into two separate arguments. -} curry : ((a,b) -> c) -> a -> b -> c curry f a b = f (a,b) {-| Change how arguments are passed to a function. This combines two arguments into a single pair. -} uncurry : (a -> b -> c) -> (a,b) -> c uncurry f (a,b) = f a b