Docs update: copy documentation from elm-lang.org
- Copy documentation from elm-lang.org (dev branch) to .elm files in libraries folder - Added TODO's for stuff that was not found in 0.8 version - Added Review TODO in json.elm
This commit is contained in:
parent
893e4691e6
commit
441d09c4a7
15 changed files with 371 additions and 28 deletions
|
@ -1,16 +1,22 @@
|
||||||
|
-- This library is a way to package up dynamic behavior. It makes it easier to
|
||||||
|
-- dynamically create dynamic components. See the [original release
|
||||||
|
-- notes](/blog/announce/version-0.5.0.elm) on this library to get a feel for how
|
||||||
|
-- it can be used.
|
||||||
module Automaton where
|
module Automaton where
|
||||||
|
|
||||||
data Automaton a b = Automaton (a -> (b, Automaton a b))
|
data Automaton a b = Automaton (a -> (b, Automaton a b))
|
||||||
|
|
||||||
|
-- Run an automaton on a given signal. The automaton takes in ‘a’ values and returns ‘b’ values. The automaton steps forward whenever the input signal updates.
|
||||||
run : Automaton a b -> Signal a -> Signal b
|
run : Automaton a b -> Signal a -> Signal b
|
||||||
run (Automaton m0) input =
|
run (Automaton m0) input =
|
||||||
lift fst $ foldp' (\a (b, Automaton m) -> m a) m0 input
|
lift fst $ foldp' (\a (b, Automaton m) -> m a) m0 input
|
||||||
|
|
||||||
|
-- Step an automaton forward once with a given input.
|
||||||
step : Automaton a b -> a -> (b, Automaton a b)
|
step : Automaton a b -> a -> (b, Automaton a b)
|
||||||
step (Automaton m) a = m a
|
step (Automaton m) a = m a
|
||||||
|
|
||||||
|
|
||||||
|
-- Compose two automatons, chaining them together.
|
||||||
(>>>) : Automaton a b -> Automaton b c -> Automaton a c
|
(>>>) : Automaton a b -> Automaton b c -> Automaton a c
|
||||||
a1 >>> a2 =
|
a1 >>> a2 =
|
||||||
let Automaton m1 = a1
|
let Automaton m1 = a1
|
||||||
|
@ -19,23 +25,29 @@ a1 >>> a2 =
|
||||||
(c,m2') = m2 b
|
(c,m2') = m2 b
|
||||||
in (c, m1' >>> m2'))
|
in (c, m1' >>> m2'))
|
||||||
|
|
||||||
|
-- Compose two automatons, chaining them together.
|
||||||
(<<<) : Automaton b c -> Automaton a b -> Automaton a c
|
(<<<) : Automaton b c -> Automaton a b -> Automaton a c
|
||||||
a2 <<< a1 = a1 >>> a2
|
a2 <<< a1 = a1 >>> a2
|
||||||
|
|
||||||
|
-- Combine a list of automatons into a single automaton that produces a list.
|
||||||
combine : [Automaton a b] -> Automaton a [b]
|
combine : [Automaton a b] -> Automaton a [b]
|
||||||
combine autos =
|
combine autos =
|
||||||
Automaton (\a -> let (bs,autos') = unzip $ map (\(Automaton m) -> m a) autos in
|
Automaton (\a -> let (bs,autos') = unzip $ map (\(Automaton m) -> m a) autos in
|
||||||
(bs, combine autos'))
|
(bs, combine autos'))
|
||||||
|
|
||||||
|
-- Create an automaton with no memory. It just applies the given function to every input.
|
||||||
pure : (a -> b) -> Automaton a b
|
pure : (a -> b) -> Automaton a b
|
||||||
pure f = Automaton (\x -> (f x, pure f))
|
pure f = Automaton (\x -> (f x, pure f))
|
||||||
|
|
||||||
|
-- Create an automaton with no memory. It just applies the given function to every input.
|
||||||
init : b -> (a -> b -> b) -> Automaton a b
|
init : b -> (a -> b -> b) -> Automaton a b
|
||||||
init s step = Automaton (\a -> let s' = step a s in (s', init s' step))
|
init s step = Automaton (\a -> let s' = step a s in (s', init s' step))
|
||||||
|
|
||||||
|
-- Create an automaton with hidden state. Requires an initial state and a step function to step the state forward and produce an output.
|
||||||
init' : s -> (a -> s -> (b,s)) -> Automaton a b
|
init' : s -> (a -> s -> (b,s)) -> Automaton a b
|
||||||
init' s step = Automaton (\a -> let (b,s') = step a s in (b , init' s' step))
|
init' s step = Automaton (\a -> let (b,s') = step a s in (b , init' s' step))
|
||||||
|
|
||||||
|
-- Count the number of steps taken.
|
||||||
count : Automaton a Int
|
count : Automaton a Int
|
||||||
count = init 0 (\_ c -> c + 1)
|
count = init 0 (\_ c -> c + 1)
|
||||||
|
|
||||||
|
@ -56,6 +68,7 @@ stepDrag (press,pos) (ds,form) =
|
||||||
else (let form' = uncurry move (vecSub pos p0) form in
|
else (let form' = uncurry move (vecSub pos p0) form in
|
||||||
(form', (Listen,form')))
|
(form', (Listen,form')))
|
||||||
|
|
||||||
|
-- Create a draggable form that can be dynamically created and added to a scene.
|
||||||
draggable : Form -> Automaton (Bool,(Int,Int)) Form
|
draggable : Form -> Automaton (Bool,(Int,Int)) Form
|
||||||
draggable form = init' (Listen,form) stepDrag
|
draggable form = init' (Listen,form) stepDrag
|
||||||
|
|
||||||
|
@ -69,3 +82,4 @@ Speeding things up is a really low priority. Language features and
|
||||||
libraries with nice APIs and are way more important!
|
libraries with nice APIs and are way more important!
|
||||||
|
|
||||||
--}
|
--}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,50 @@
|
||||||
|
|
||||||
|
-- Library for working with dates. It is still a work in progress, so email
|
||||||
|
-- the mailing list if you are having issues with internationalization or
|
||||||
|
-- locale formatting or something.
|
||||||
module Date where
|
module Date where
|
||||||
|
|
||||||
|
-- Represents the days of the week.
|
||||||
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
|
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
|
||||||
|
|
||||||
|
-- Represents the month of the year.
|
||||||
data Month = Jan | Feb | Mar | Apr
|
data Month = Jan | Feb | Mar | Apr
|
||||||
| May | Jun | Jul | Aug
|
| May | Jun | Jul | Aug
|
||||||
| Sep | Oct | Nov | Dec
|
| Sep | Oct | Nov | Dec
|
||||||
|
|
||||||
read : String -> Date
|
-- Attempt to read a date from a string.
|
||||||
|
read : String -> Maybe Date
|
||||||
|
|
||||||
|
-- Convert a date into a time since midnight (UTC) of 1 January 1990 (i.e.
|
||||||
|
-- [UNIX time](http://en.wikipedia.org/wiki/Unix_time)). Given the date 23 June
|
||||||
|
-- 1990 at 11:45AM this returns the corresponding time.
|
||||||
toTime : Date -> Time
|
toTime : Date -> Time
|
||||||
|
|
||||||
|
-- Extract the year of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the integer `1990`.
|
||||||
year : Date -> Int
|
year : Date -> Int
|
||||||
|
|
||||||
|
-- Extract the month of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the Month `Jun` as defined below.
|
||||||
month : Date -> Month
|
month : Date -> Month
|
||||||
|
|
||||||
|
|
||||||
|
-- Extract the day of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the integer `23`.
|
||||||
day : Date -> Int
|
day : Date -> Int
|
||||||
|
|
||||||
|
-- Extract the day of the week for a given date. Given the date 23 June
|
||||||
|
-- 1990 at 11:45AM this returns the Day `Thu` as defined below.
|
||||||
dayOfWeek : Date -> Day
|
dayOfWeek : Date -> Day
|
||||||
|
|
||||||
|
-- Extract the hour of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the integer `11`.
|
||||||
hour : Date -> Int
|
hour : Date -> Int
|
||||||
|
|
||||||
|
-- Extract the minute of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the integer `45`.
|
||||||
minute : Date -> Int
|
minute : Date -> Int
|
||||||
|
|
||||||
|
-- Extract the second of a given date. Given the date 23 June 1990 at 11:45AM
|
||||||
|
-- this returns the integer `0`.
|
||||||
second : Date -> Int
|
second : Date -> Int
|
||||||
|
|
|
@ -16,6 +16,7 @@ data NColor = Red | Black
|
||||||
|
|
||||||
data Dict k v = Node NColor k v (Dict k v) (Dict k v) | Empty
|
data Dict k v = Node NColor k v (Dict k v) (Dict k v) | Empty
|
||||||
|
|
||||||
|
-- Create an empty dictionary.
|
||||||
empty : Dict k v
|
empty : Dict k v
|
||||||
empty = Empty
|
empty = Empty
|
||||||
|
|
||||||
|
@ -114,6 +115,7 @@ max t =
|
||||||
}
|
}
|
||||||
--}
|
--}
|
||||||
|
|
||||||
|
-- Lookup the value associated with a key.
|
||||||
lookup : k -> Dict k v -> Maybe v
|
lookup : k -> Dict k v -> Maybe v
|
||||||
lookup k t =
|
lookup k t =
|
||||||
case t of
|
case t of
|
||||||
|
@ -124,6 +126,7 @@ lookup k t =
|
||||||
EQ -> Just v
|
EQ -> Just v
|
||||||
GT -> lookup k r
|
GT -> lookup k r
|
||||||
|
|
||||||
|
-- Find the value associated with a key. If the key is not found, return the default value.
|
||||||
findWithDefault : v -> k -> Dict k v -> v
|
findWithDefault : v -> k -> Dict k v -> v
|
||||||
findWithDefault base k t =
|
findWithDefault base k t =
|
||||||
case t of
|
case t of
|
||||||
|
@ -135,6 +138,7 @@ findWithDefault base k t =
|
||||||
GT -> findWithDefault base k r
|
GT -> findWithDefault base k r
|
||||||
|
|
||||||
{--
|
{--
|
||||||
|
-- Find the value associated with a key. If the key is not found, there will be a runtime error.
|
||||||
find k t =
|
find k t =
|
||||||
case t of
|
case t of
|
||||||
{ Empty -> Error.raise "Key was not found in dictionary!"
|
{ Empty -> Error.raise "Key was not found in dictionary!"
|
||||||
|
@ -146,8 +150,9 @@ find k t =
|
||||||
}
|
}
|
||||||
--}
|
--}
|
||||||
|
|
||||||
-- Does t contain k?
|
-- Determine if a key is in a dictionary.
|
||||||
member : k -> Dict k v -> Bool
|
member : k -> Dict k v -> Bool
|
||||||
|
-- Does t contain k?
|
||||||
member k t = Maybe.isJust $ lookup k t
|
member k t = Maybe.isJust $ lookup k t
|
||||||
|
|
||||||
rotateLeft : Dict k v -> Dict k v
|
rotateLeft : Dict k v -> Dict k v
|
||||||
|
@ -201,6 +206,7 @@ ensureBlackRoot t =
|
||||||
Node Red k v l r -> Node Black k v l r
|
Node Red k v l r -> Node Black k v l r
|
||||||
_ -> t
|
_ -> t
|
||||||
|
|
||||||
|
-- Insert a key-value pair into a dictionary. Replaces value when there is a collision.
|
||||||
-- Invariant: t is a valid left-leaning rb tree *)
|
-- Invariant: t is a valid left-leaning rb tree *)
|
||||||
insert : k -> v -> Dict k v -> Dict k v
|
insert : k -> v -> Dict k v -> Dict k v
|
||||||
insert k v t =
|
insert k v t =
|
||||||
|
@ -223,6 +229,7 @@ insert k v t =
|
||||||
else new_t)
|
else new_t)
|
||||||
--}
|
--}
|
||||||
|
|
||||||
|
-- Create a dictionary with one key-value pair.
|
||||||
singleton : k -> v -> Dict k v
|
singleton : k -> v -> Dict k v
|
||||||
singleton k v = insert k v Empty
|
singleton k v = insert k v Empty
|
||||||
|
|
||||||
|
@ -303,6 +310,7 @@ deleteMax t =
|
||||||
in ensureBlackRoot (del t)
|
in ensureBlackRoot (del t)
|
||||||
--}
|
--}
|
||||||
|
|
||||||
|
-- Remove a key-value pair from a dictionary. If the key is not found, no changes are made.
|
||||||
remove : k -> Dict k v -> Dict k v
|
remove : k -> Dict k v -> Dict k v
|
||||||
remove k t =
|
remove k t =
|
||||||
let eq_and_noRightNode t =
|
let eq_and_noRightNode t =
|
||||||
|
@ -335,43 +343,53 @@ remove k t =
|
||||||
Error.raise "invariants broken after remove")
|
Error.raise "invariants broken after remove")
|
||||||
--}
|
--}
|
||||||
|
|
||||||
|
-- Apply a function to all values in a dictionary.
|
||||||
map : (a -> b) -> Dict k a -> Dict k b
|
map : (a -> b) -> Dict k a -> Dict k b
|
||||||
map f t =
|
map f t =
|
||||||
case t of
|
case t of
|
||||||
Empty -> Empty
|
Empty -> Empty
|
||||||
Node c k v l r -> Node c k (f v) (map f l) (map f r)
|
Node c k v l r -> Node c k (f v) (map f l) (map f r)
|
||||||
|
|
||||||
|
-- Fold over the key-value pairs in a dictionary, in order from lowest key to highest key.
|
||||||
foldl : (k -> v -> b -> b) -> b -> Dict k v -> b
|
foldl : (k -> v -> b -> b) -> b -> Dict k v -> b
|
||||||
foldl f acc t =
|
foldl f acc t =
|
||||||
case t of
|
case t of
|
||||||
Empty -> acc
|
Empty -> acc
|
||||||
Node _ k v l r -> foldl f (f k v (foldl f acc l)) r
|
Node _ k v l r -> foldl f (f k v (foldl f acc l)) r
|
||||||
|
|
||||||
|
-- Fold over the key-value pairs in a dictionary, in order from highest key to lowest key.
|
||||||
foldr : (k -> v -> b -> b) -> b -> Dict k v -> b
|
foldr : (k -> v -> b -> b) -> b -> Dict k v -> b
|
||||||
foldr f acc t =
|
foldr f acc t =
|
||||||
case t of
|
case t of
|
||||||
Empty -> acc
|
Empty -> acc
|
||||||
Node _ k v l r -> foldr f (f k v (foldr f acc r)) l
|
Node _ k v l r -> foldr f (f k v (foldr f acc r)) l
|
||||||
|
|
||||||
|
-- Combine two dictionaries. If there is a collision, preference is given to the first dictionary.
|
||||||
union : Dict k v -> Dict k v -> Dict k v
|
union : Dict k v -> Dict k v -> Dict k v
|
||||||
union t1 t2 = foldl insert t2 t1
|
union t1 t2 = foldl insert t2 t1
|
||||||
|
|
||||||
|
-- Keep a key-value pair when its key appears in the second dictionary. Preference is given to values in the first dictionary.
|
||||||
intersect : Dict k v -> Dict k v -> Dict k v
|
intersect : Dict k v -> Dict k v -> Dict k v
|
||||||
intersect t1 t2 =
|
intersect t1 t2 =
|
||||||
let combine k v t = if k `member` t2 then insert k v t else t
|
let combine k v t = if k `member` t2 then insert k v t else t
|
||||||
in foldl combine empty t1
|
in foldl combine empty t1
|
||||||
|
|
||||||
|
-- Keep a key-value pair when its key does not appear in the second dictionary. Preference is given to the first dictionary.
|
||||||
diff : Dict k v -> Dict k v -> Dict k v
|
diff : Dict k v -> Dict k v -> Dict k v
|
||||||
diff t1 t2 = foldl (\k v t -> remove k t) t1 t2
|
diff t1 t2 = foldl (\k v t -> remove k t) t1 t2
|
||||||
|
|
||||||
|
-- Get all of the keys in a dictionary.
|
||||||
keys : Dict k v -> [k]
|
keys : Dict k v -> [k]
|
||||||
keys t = foldr (\k v acc -> k :: acc) [] t
|
keys t = foldr (\k v acc -> k :: acc) [] t
|
||||||
|
|
||||||
|
-- Get all of the values in a dictionary.
|
||||||
values : Dict k v -> [v]
|
values : Dict k v -> [v]
|
||||||
values t = foldr (\k v acc -> v :: acc) [] t
|
values t = foldr (\k v acc -> v :: acc) [] t
|
||||||
|
|
||||||
|
-- Convert a dictionary into an association list of key-value pairs.
|
||||||
toList : Dict k v -> [(k,v)]
|
toList : Dict k v -> [(k,v)]
|
||||||
toList t = foldr (\k v acc -> (k,v) :: acc) [] t
|
toList t = foldr (\k v acc -> (k,v) :: acc) [] t
|
||||||
|
|
||||||
|
-- Convert an association list into a dictionary.
|
||||||
fromList : [(k,v)] -> Dict k v
|
fromList : [(k,v)] -> Dict k v
|
||||||
fromList assocs = List.foldl (uncurry insert) empty assocs
|
fromList assocs = List.foldl (uncurry insert) empty assocs
|
||||||
|
|
|
@ -3,24 +3,34 @@ module Either where
|
||||||
|
|
||||||
import List
|
import List
|
||||||
|
|
||||||
|
-- Represents any data that can take two different types.
|
||||||
|
--
|
||||||
|
-- This can also be used for error handling `(Either String a)` where error
|
||||||
|
-- messages are stored on the left, and the correct values (“right” values) are stored on the right.
|
||||||
data Either a b = Left a | Right b
|
data Either a b = Left a | Right b
|
||||||
|
|
||||||
|
-- Apply the first function to a `Left` and the second function to a `Right`.
|
||||||
|
-- This allows the extraction of a value from an `Either`.
|
||||||
either : (a -> c) -> (b -> c) -> Either a b -> c
|
either : (a -> c) -> (b -> c) -> Either a b -> c
|
||||||
either f g e = case e of { Left x -> f x ; Right y -> g y }
|
either f g e = case e of { Left x -> f x ; Right y -> g y }
|
||||||
|
|
||||||
|
-- True if the value is a `Left`.
|
||||||
isLeft : Either a b -> Bool
|
isLeft : Either a b -> Bool
|
||||||
isLeft e = case e of { Left _ -> True ; _ -> False }
|
isLeft e = case e of { Left _ -> True ; _ -> False }
|
||||||
|
|
||||||
|
-- True if the value is a `Right`.
|
||||||
isRight : Either a b -> Bool
|
isRight : Either a b -> Bool
|
||||||
isRight e = case e of { Right _ -> True ; _ -> False }
|
isRight e = case e of { Right _ -> True ; _ -> False }
|
||||||
|
|
||||||
|
-- Keep only the values held in `Left` values.
|
||||||
--lefts : [Either a b] -> [a]
|
--lefts : [Either a b] -> [a]
|
||||||
lefts es = List.filter isLeft es
|
lefts es = List.filter isLeft es
|
||||||
|
|
||||||
|
-- Keep only the values held in `Right` values.
|
||||||
--rights : [Either a b] -> [b]
|
--rights : [Either a b] -> [b]
|
||||||
rights es = List.filter isRight es
|
rights es = List.filter isRight es
|
||||||
|
|
||||||
|
-- Split into two lists, lefts on the left and rights on the right. So we
|
||||||
|
-- have the equivalence: `(partition es == (lefts es, rights es))`
|
||||||
-- partition : [Either a b] -> ([a],[b])
|
-- partition : [Either a b] -> ([a],[b])
|
||||||
partition es = List.partition isLeft es
|
partition es = List.partition isLeft es
|
|
@ -11,7 +11,10 @@ module Graphics.Color (rgba,rgb,hsva,hsv,
|
||||||
|
|
||||||
data Color = Color Int Int Int Float
|
data Color = Color Int Int Int Float
|
||||||
|
|
||||||
|
-- Create RGB colors with an alpha component for transparency. The alpha component is specified with numbers between 0 and 1.
|
||||||
rgba = Color
|
rgba = Color
|
||||||
|
|
||||||
|
-- Create RGB colors from numbers between 0 and 255 inclusive.
|
||||||
rgb r g b = Color r g b 1
|
rgb r g b = Color r g b 1
|
||||||
|
|
||||||
red = Color 255 0 0 1
|
red = Color 255 0 0 1
|
||||||
|
@ -38,8 +41,22 @@ purple = Color 128 0 128 1
|
||||||
forestGreen = Color 34 139 34 1
|
forestGreen = Color 34 139 34 1
|
||||||
violet = Color 238 130 238 1
|
violet = Color 238 130 238 1
|
||||||
|
|
||||||
|
-- Produce a “complementary color”. The two colors will accent each other.
|
||||||
complement : Color -> Color
|
complement : Color -> Color
|
||||||
|
|
||||||
|
-- Create HSV colors with an alpha component for transparency. The alpha component is specified with numbers between 0 and 1.
|
||||||
hsva : Int -> Float -> Float -> Float -> Color
|
hsva : Int -> Float -> Float -> Float -> Color
|
||||||
|
|
||||||
|
-- Create HSV colors. HSV stands for hue-saturation-value.
|
||||||
|
--
|
||||||
|
-- Hue is a degree from 0 to 360 representing a color wheel: red at 0°, green at 120°, blue at 240°, and red again at 360°.
|
||||||
|
-- This makes it easy to cycle through colors and compute color complements, triads, tetrads, etc.
|
||||||
|
--
|
||||||
|
-- Saturation is a number between 1 and 0 where lowering this number makes your color more grey. This can help you tone a color down.
|
||||||
|
--
|
||||||
|
-- Value is also a number between 1 and 0. Lowering this number makes your color more black.
|
||||||
|
--
|
||||||
|
-- Look up the “HSV cylinder” for more information.
|
||||||
hsv : Int -> Float -> Float -> Color
|
hsv : Int -> Float -> Float -> Color
|
||||||
|
|
||||||
data Gradient
|
data Gradient
|
||||||
|
|
|
@ -4,21 +4,57 @@ module Graphics.Text where
|
||||||
import Native.Graphics.Text as T
|
import Native.Graphics.Text as T
|
||||||
|
|
||||||
|
|
||||||
|
-- Convert a string into text which can be styled and displayed.
|
||||||
toText : String -> Text
|
toText : String -> Text
|
||||||
|
|
||||||
|
-- Set the typeface of some text. The first argument should be a comma separated listing of the desired typefaces
|
||||||
|
-- "helvetica, arial, sans-serif"
|
||||||
|
-- Works the same as the CSS font-family property.
|
||||||
typeface : String -> Text -> Text
|
typeface : String -> Text -> Text
|
||||||
|
|
||||||
|
-- Switch to a monospace typeface. Good for code snippets.
|
||||||
|
monospace : Text -> Text
|
||||||
|
|
||||||
|
-- Make text big and noticable.
|
||||||
|
header : Text -> Text
|
||||||
|
|
||||||
|
-- Create a link.
|
||||||
href : String -> Text -> Text
|
href : String -> Text -> Text
|
||||||
|
|
||||||
|
-- Set the height of text in \"ems\". 1em is the normal height of text. 2ems is twice that height.
|
||||||
height : Float -> Text -> Text
|
height : Float -> Text -> Text
|
||||||
|
|
||||||
|
-- Set the color of a string.
|
||||||
color : Color -> Text -> Text
|
color : Color -> Text -> Text
|
||||||
|
|
||||||
|
-- Make a string bold.
|
||||||
bold : Text -> Text
|
bold : Text -> Text
|
||||||
|
|
||||||
|
-- Italicize a string.
|
||||||
italic : Text -> Text
|
italic : Text -> Text
|
||||||
|
|
||||||
|
-- Draw a line above a string.
|
||||||
overline : Text -> Text
|
overline : Text -> Text
|
||||||
|
|
||||||
|
-- Underline a string.
|
||||||
underline : Text -> Text
|
underline : Text -> Text
|
||||||
|
|
||||||
|
-- Draw a line through a string.
|
||||||
strikeThrough : Text -> Text
|
strikeThrough : Text -> Text
|
||||||
|
|
||||||
|
-- Display justified, styled text.
|
||||||
justified : Text -> Element
|
justified : Text -> Element
|
||||||
|
|
||||||
|
-- Display centered, styled text.
|
||||||
centered : Text -> Element
|
centered : Text -> Element
|
||||||
|
|
||||||
|
-- Display right justified, styled text.
|
||||||
righted : Text -> Element
|
righted : Text -> Element
|
||||||
|
|
||||||
|
-- Display styled text.
|
||||||
text : Text -> Element
|
text : Text -> Element
|
||||||
|
|
||||||
|
-- Convert anything to it's textual representation and make it displayable in browser
|
||||||
|
-- asText = text . monospace . show
|
||||||
|
-- Excellent for debugging
|
||||||
asText : a -> Element
|
asText : a -> Element
|
||||||
|
|
|
@ -5,17 +5,39 @@ module JavaScript where
|
||||||
-- To Elm
|
-- To Elm
|
||||||
|
|
||||||
toString : JSString -> String
|
toString : JSString -> String
|
||||||
|
|
||||||
|
-- Requires that the input array be uniform (all members have the same type)
|
||||||
toList : JSArray a -> [a]
|
toList : JSArray a -> [a]
|
||||||
|
|
||||||
toInt : JSNumber -> Int
|
toInt : JSNumber -> Int
|
||||||
toFloat : JSNumber -> Float
|
toFloat : JSNumber -> Float
|
||||||
|
|
||||||
|
-- Conversion from JavaScript boolean values to Elm boolean values.
|
||||||
toBool : JSBool -> Bool
|
toBool : JSBool -> Bool
|
||||||
|
|
||||||
|
|
||||||
-- From Elm
|
-- From Elm
|
||||||
|
|
||||||
fromString : String -> JSString
|
fromString : String -> JSString
|
||||||
|
|
||||||
|
-- Produces a uniform JavaScript array with all members of the same type.
|
||||||
fromList : [a] -> JSArray a
|
fromList : [a] -> JSArray a
|
||||||
|
|
||||||
fromInt : Int -> JSNumber
|
fromInt : Int -> JSNumber
|
||||||
fromFloat : Float -> JSNumber
|
fromFloat : Float -> JSNumber
|
||||||
|
|
||||||
|
-- Conversion from Elm boolean values to JavaScript boolean values.
|
||||||
fromBool : Bool -> JSBool
|
fromBool : Bool -> JSBool
|
||||||
|
|
||||||
|
{-- TODO: only found in docs
|
||||||
|
|
||||||
|
, ("castTupleToJSTuple2" , "(a,b) -> JSTuple2 a b", "A JSTupleN is an array of size N with nonuniform types. Each member can have a different type.")
|
||||||
|
, ("castJSTupleToTuple2" , "JSTuple2 a b -> (a,b)", "")
|
||||||
|
, ("castTupleToJSTuple3" , "(a,b,c) -> JSTuple3 a b c", "")
|
||||||
|
, ("castJSTupleToTuple3" , "JSTuple3 a b c > (a,b,c)", "")
|
||||||
|
, ("castTupleToJSTuple4" , "(a,b,c,d) -> JSTuple4 a b c d", "")
|
||||||
|
, ("castJSTupleToTuple4" , "JSTuple4 a b c d -> (a,b,c,d)", "")
|
||||||
|
, ("castTupleToJSTuple5" , "(a,b,c,d,e) -> JSTuple5 a b c d e", "")
|
||||||
|
, ("castJSTupleToTuple5" , "JSTuple5 a b c d e -> (a,b,c,d,e)", "")
|
||||||
|
|
||||||
|
--}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
|
||||||
|
-- TOOD: Evan please review texts
|
||||||
|
|
||||||
module Json where
|
module Json where
|
||||||
|
|
||||||
import Dict as Dict
|
import Dict as Dict
|
||||||
import JavaScript as JS
|
import JavaScript as JS
|
||||||
import Native.Json as Native
|
import Native.Json as Native
|
||||||
|
|
||||||
|
-- This datatype can represent all valid values that can be held in a JSON object.
|
||||||
|
-- In Elm, a proper JSON object is represented as a (Dict String Value) which is a mapping from strings to Json Values.
|
||||||
data Value
|
data Value
|
||||||
= String String
|
= String String
|
||||||
| Number Float
|
| Number Float
|
||||||
|
@ -17,18 +20,25 @@ data Value
|
||||||
|
|
||||||
-- String Converters
|
-- String Converters
|
||||||
|
|
||||||
|
-- Convert a proper JSON object into a string.
|
||||||
toString : Value -> String
|
toString : Value -> String
|
||||||
toString v = JS.toString (Native.toPrettyJSString "" v)
|
toString v = JS.toString (Native.toPrettyJSString "" v)
|
||||||
|
|
||||||
|
-- Convert a proper JSON object into a prettified string.
|
||||||
|
-- The first argument is a separator token (e.g. \" \", \"\\n\", etc.) that will be used for indentation in the prettified string version of the JSON object.
|
||||||
toPrettyString : String -> Value -> String
|
toPrettyString : String -> Value -> String
|
||||||
toPrettyString sep v = JS.toString (Native.toPrettyJSString sep v)
|
toPrettyString sep v = JS.toString (Native.toPrettyJSString sep v)
|
||||||
|
|
||||||
|
-- Convert a proper JSON object into a JavaScript string.
|
||||||
|
-- Note that the type JSString seen here is not the same as the type constructor JsonString used elsewhere in this module.
|
||||||
toJSString : Value -> JSString
|
toJSString : Value -> JSString
|
||||||
toJSString v = Native.toPrettyJSString "" v
|
toJSString v = Native.toPrettyJSString "" v
|
||||||
|
|
||||||
|
-- Parse a string representation of a proper JSON object into its Elm's representation.
|
||||||
fromString : String -> Maybe Value
|
fromString : String -> Maybe Value
|
||||||
fromString s = Native.fromJSString (JS.fromString s)
|
fromString s = Native.fromJSString (JS.fromString s)
|
||||||
|
|
||||||
|
-- Parse a JavaScript string representation of a proper JSON object into its Elm's representation.
|
||||||
fromJSString : JSString -> Maybe Value
|
fromJSString : JSString -> Maybe Value
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,6 +62,7 @@ object v = case v of { Object o -> o ; _ -> Dict.empty }
|
||||||
|
|
||||||
-- Extract Elm values from dictionaries of Json values
|
-- Extract Elm values from dictionaries of Json values
|
||||||
|
|
||||||
|
-- Find a value in a Json Object using the passed get function. If the key is not found, this returns the given default/base value.
|
||||||
find get base =
|
find get base =
|
||||||
let f key dict =
|
let f key dict =
|
||||||
case Dict.lookup key dict of
|
case Dict.lookup key dict of
|
||||||
|
@ -59,17 +70,22 @@ find get base =
|
||||||
Just v -> get v
|
Just v -> get v
|
||||||
in f
|
in f
|
||||||
|
|
||||||
|
-- Find a string value in an Elm Json object. If the key is not found or the value found is not a string, this returns the empty string.
|
||||||
findString : String -> Dict String Value -> String
|
findString : String -> Dict String Value -> String
|
||||||
findString = find string ""
|
findString = find string ""
|
||||||
|
|
||||||
|
-- Find a number value in an Elm Json object. If the key is not found or the value found is not a number, this returns 0
|
||||||
findNumber : String -> Dict String Value -> Float
|
findNumber : String -> Dict String Value -> Float
|
||||||
findNumber = find number 0
|
findNumber = find number 0
|
||||||
|
|
||||||
|
-- Find a boolean value in an Elm Json object. If the key is not found or the value found is not a boolean, this returns the False.
|
||||||
findBoolean : String -> Dict String Value -> Bool
|
findBoolean : String -> Dict String Value -> Bool
|
||||||
findBoolean = find boolean False
|
findBoolean = find boolean False
|
||||||
|
|
||||||
|
-- Find an array value in an Elm Json object. If the key is not found or the value found is not an array, this returns an empty list.
|
||||||
findArray : String -> Dict String Value -> [Value]
|
findArray : String -> Dict String Value -> [Value]
|
||||||
findArray = find array []
|
findArray = find array []
|
||||||
|
|
||||||
|
-- Find an object value in an Elm Json object. If the key is not found or the value found is not an object, this returns an empty object.
|
||||||
findObject : String -> Dict String Value -> Dict String Value
|
findObject : String -> Dict String Value -> Dict String Value
|
||||||
findObject = find object Dict.empty
|
findObject = find object Dict.empty
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
-- These are nicely curated inputs from the keyboard. See the
|
-- These are nicely curated inputs from the keyboard. See the
|
||||||
-- [Keyboard.Raw library](/docs/Signal/KeyboardRaw.elm) for a
|
-- [Keyboard.Raw library](/docs/Signal/KeyboardRaw.elm) for a
|
||||||
-- lower-level interface that will let you define more complicated behavior.
|
-- lower-level interface that will let you define more complicated behavior.
|
||||||
|
|
||||||
module Keyboard where
|
module Keyboard where
|
||||||
|
|
||||||
import Native.Keyboard as N
|
import Native.Keyboard as N
|
||||||
|
|
|
@ -4,36 +4,77 @@ module List where
|
||||||
import Native.Utils (min, max)
|
import Native.Utils (min, max)
|
||||||
import Native.List as L
|
import Native.List as L
|
||||||
|
|
||||||
|
-- Extract the first element of a list. List must be non-empty.
|
||||||
head : [a] -> a
|
head : [a] -> a
|
||||||
|
|
||||||
|
-- Extract the elements after the head of the list. List must be non-empty.
|
||||||
tail : [a] -> [a]
|
tail : [a] -> [a]
|
||||||
|
|
||||||
|
-- Extract the last element of a list. List must be non-empty.
|
||||||
last : [a] -> a
|
last : [a] -> a
|
||||||
|
|
||||||
|
-- Apply a function to every element of a list.
|
||||||
map : (a -> b) -> [a] -> [b]
|
map : (a -> b) -> [a] -> [b]
|
||||||
|
|
||||||
|
-- Reduce a list from the left.
|
||||||
foldl : (a -> b -> b) -> b -> [a] -> b
|
foldl : (a -> b -> b) -> b -> [a] -> b
|
||||||
|
|
||||||
|
-- Reduce a list from the right.
|
||||||
foldr : (a -> b -> b) -> b -> [a] -> b
|
foldr : (a -> b -> b) -> b -> [a] -> b
|
||||||
|
|
||||||
|
-- Reduce a list from the left without a base case. List must be non-empty.
|
||||||
foldl1 : (a -> a -> a) -> [a] -> a
|
foldl1 : (a -> a -> a) -> [a] -> a
|
||||||
|
|
||||||
|
-- Reduce a list from the right without a base case. List must be non-empty.
|
||||||
foldr1 : (a -> a -> a) -> [a] -> a
|
foldr1 : (a -> a -> a) -> [a] -> a
|
||||||
|
|
||||||
|
-- Reduce a list from the left, building up all of the intermediate results into a list.
|
||||||
scanl : (a -> b -> b) -> b -> [a] -> [b]
|
scanl : (a -> b -> b) -> b -> [a] -> [b]
|
||||||
|
|
||||||
|
-- Same as scanl but it doesn't require a base case. List must be non-empty.
|
||||||
scanl1 : (a -> a -> a) -> [a] -> [a]
|
scanl1 : (a -> a -> a) -> [a] -> [a]
|
||||||
|
|
||||||
|
-- Filter out elements which do not satisfy the predicate.
|
||||||
filter : (a -> Bool) -> [a] -> [a]
|
filter : (a -> Bool) -> [a] -> [a]
|
||||||
|
|
||||||
|
-- Determine the length of a list.
|
||||||
length : [a] -> Int
|
length : [a] -> Int
|
||||||
|
|
||||||
|
-- Reverse a list.
|
||||||
reverse : [a] -> [a]
|
reverse : [a] -> [a]
|
||||||
|
|
||||||
|
-- Check to see if all elements satisfy the predicate.
|
||||||
all : (a -> Bool) -> [a] -> Bool
|
all : (a -> Bool) -> [a] -> Bool
|
||||||
|
|
||||||
|
-- Check to see if any elements satisfy the predicate.
|
||||||
any : (a -> Bool) -> [a] -> Bool
|
any : (a -> Bool) -> [a] -> Bool
|
||||||
|
|
||||||
|
-- Check to see if all elements are True.
|
||||||
and : [Bool] -> Bool
|
and : [Bool] -> Bool
|
||||||
|
|
||||||
|
-- Check to see if any elements are True.
|
||||||
or : [Bool] -> Bool
|
or : [Bool] -> Bool
|
||||||
|
|
||||||
|
-- Flatten a list of lists.
|
||||||
concat : [[a]] -> [a]
|
concat : [[a]] -> [a]
|
||||||
|
|
||||||
|
-- Map a given function onto a list and flatten the resulting lists. (concatMap f xs == concat (map f xs))
|
||||||
concatMap : (a -> [b]) -> [a] -> [b]
|
concatMap : (a -> [b]) -> [a] -> [b]
|
||||||
concatMap f = L.concat . L.map f
|
concatMap f = L.concat . L.map f
|
||||||
|
|
||||||
|
-- Get the sum of the list elements.
|
||||||
sum = L.foldl (+) 0
|
sum = L.foldl (+) 0
|
||||||
|
|
||||||
|
-- Get the product of the list elements.
|
||||||
product = L.foldl (*) 1
|
product = L.foldl (*) 1
|
||||||
|
|
||||||
|
-- Find the highest number in a non-empty list.
|
||||||
maximum = L.foldl1 max
|
maximum = L.foldl1 max
|
||||||
|
|
||||||
|
-- Find the lowest number in a non-empty list.
|
||||||
minimum = L.foldl1 min
|
minimum = L.foldl1 min
|
||||||
|
|
||||||
|
-- Split a list based on the predicate.
|
||||||
partition : (a -> Bool) -> [a] -> ([a],[a])
|
partition : (a -> Bool) -> [a] -> ([a],[a])
|
||||||
partition pred lst =
|
partition pred lst =
|
||||||
case lst of
|
case lst of
|
||||||
|
@ -41,18 +82,28 @@ partition pred lst =
|
||||||
x::xs -> let (bs,cs) = partition pred xs in
|
x::xs -> let (bs,cs) = partition pred xs in
|
||||||
if pred x then (x::bs,cs) else (bs,x::cs)
|
if pred x then (x::bs,cs) else (bs,x::cs)
|
||||||
|
|
||||||
zipWith : (a -> b -> c) -> [a] -> [b] -> [c]
|
-- Combine two lists, combining them into tuples pairwise. If one input list has extra elements (it is longer), those elements are dropped.
|
||||||
zip : [a] -> [b] -> [(a,b)]
|
zip : [a] -> [b] -> [(a,b)]
|
||||||
|
|
||||||
|
-- Combine two lists, combining them with the given function. If one input list has extra elements (it is longer), those elements are dropped.
|
||||||
|
zipWith : (a -> b -> c) -> [a] -> [b] -> [c]
|
||||||
|
|
||||||
|
-- Decompose a list of tuples
|
||||||
unzip : [(a,b)] -> ([a],[b])
|
unzip : [(a,b)] -> ([a],[b])
|
||||||
unzip pairs =
|
unzip pairs =
|
||||||
case pairs of
|
case pairs of
|
||||||
[] -> ([],[])
|
[] -> ([],[])
|
||||||
(x,y)::ps -> let (xs,ys) = (unzip ps) in (x::xs,y::ys)
|
(x,y)::ps -> let (xs,ys) = (unzip ps) in (x::xs,y::ys)
|
||||||
|
|
||||||
|
-- Split a list
|
||||||
|
-- split "," "hello,there,friend" == ["hello", "there", "friend"]
|
||||||
split : [a] -> [a] -> [[a]]
|
split : [a] -> [a] -> [[a]]
|
||||||
|
|
||||||
|
-- Places the given value between all of the lists in the second argument and concatenates the result.
|
||||||
|
-- join xs xss = concat (intersperse xs xss)
|
||||||
join : [a] -> [[a]] -> [a]
|
join : [a] -> [[a]] -> [a]
|
||||||
|
|
||||||
|
-- Places the given value between all members of the given list.
|
||||||
intersperse : a -> [a] -> [a]
|
intersperse : a -> [a] -> [a]
|
||||||
intersperse sep xs =
|
intersperse sep xs =
|
||||||
case xs of
|
case xs of
|
||||||
|
@ -60,3 +111,22 @@ intersperse sep xs =
|
||||||
[a] -> [a]
|
[a] -> [a]
|
||||||
[] -> []
|
[] -> []
|
||||||
|
|
||||||
|
{-- TODO: only found in docs
|
||||||
|
|
||||||
|
-- Add an element to the front of a list
|
||||||
|
-- a :: [b,c] = [a,b,c]
|
||||||
|
(::) : a -> [a] -> [a]
|
||||||
|
|
||||||
|
-- Appends two lists.
|
||||||
|
(++) : [a] -> [a] -> [a]
|
||||||
|
|
||||||
|
-- Take the first n members of a list.
|
||||||
|
-- take 2 [1,2,3,4]) ==> [1,2]
|
||||||
|
take : Int -> [a] -> [a]
|
||||||
|
|
||||||
|
-- Drop the first n members of a list.
|
||||||
|
-- drop 2 [1,2,3,4]) ==> [3,4]
|
||||||
|
drop : Int -> [a] -> [a]
|
||||||
|
|
||||||
|
--}
|
||||||
|
|
||||||
|
|
|
@ -11,41 +11,54 @@ import List as List
|
||||||
|
|
||||||
type Set t = Dict t ()
|
type Set t = Dict t ()
|
||||||
|
|
||||||
|
-- Create an empty set.
|
||||||
empty : Set t
|
empty : Set t
|
||||||
empty = Dict.empty
|
empty = Dict.empty
|
||||||
|
|
||||||
|
-- Create a set with one value.
|
||||||
singleton : t -> Set t
|
singleton : t -> Set t
|
||||||
singleton k = Dict.singleton k ()
|
singleton k = Dict.singleton k ()
|
||||||
|
|
||||||
|
-- Insert a value into a set.
|
||||||
insert : t -> Set t -> Set t
|
insert : t -> Set t -> Set t
|
||||||
insert k = Dict.insert k ()
|
insert k = Dict.insert k ()
|
||||||
|
|
||||||
|
-- Remove a value from a set. If the value is not found, no changes are made.
|
||||||
remove : t -> Set t -> Set t
|
remove : t -> Set t -> Set t
|
||||||
remove = Dict.remove
|
remove = Dict.remove
|
||||||
|
|
||||||
|
-- Determine if a value is in a set.
|
||||||
member : t -> Set t -> Bool
|
member : t -> Set t -> Bool
|
||||||
member = Dict.member
|
member = Dict.member
|
||||||
|
|
||||||
|
-- Get the union of two sets. Keep all values.
|
||||||
union : Set t -> Set t -> Set t
|
union : Set t -> Set t -> Set t
|
||||||
union = Dict.union
|
union = Dict.union
|
||||||
|
|
||||||
|
-- Get the intersection of two sets. Keeps values that appear in both sets.
|
||||||
intersect : Set t -> Set t -> Set t
|
intersect : Set t -> Set t -> Set t
|
||||||
intersect = Dict.intersect
|
intersect = Dict.intersect
|
||||||
|
|
||||||
|
-- Get the difference between the first set and the second. Keeps values that do not appear in the second set.
|
||||||
diff : Set t -> Set t -> Set t
|
diff : Set t -> Set t -> Set t
|
||||||
diff = Dict.diff
|
diff = Dict.diff
|
||||||
|
|
||||||
|
-- Convert a set into a list.
|
||||||
toList : Set t -> [t]
|
toList : Set t -> [t]
|
||||||
toList = Dict.keys
|
toList = Dict.keys
|
||||||
|
|
||||||
|
-- Convert a list into a set, removing any duplicates.
|
||||||
fromList : [t] -> Set t
|
fromList : [t] -> Set t
|
||||||
fromList xs = List.foldl (\k t -> Dict.insert k () t) empty xs
|
fromList xs = List.foldl (\k t -> Dict.insert k () t) empty xs
|
||||||
|
|
||||||
|
-- Fold over the values in a set, in order from lowest to highest.
|
||||||
foldl : (a -> b -> b) -> b -> Set a -> b
|
foldl : (a -> b -> b) -> b -> Set a -> b
|
||||||
foldl f b s = Dict.foldl (\k _ b -> f k b) b s
|
foldl f b s = Dict.foldl (\k _ b -> f k b) b s
|
||||||
|
|
||||||
|
-- Fold over the values in a set, in order from highest to lowest.
|
||||||
foldr : (a -> b -> b) -> b -> Set a -> b
|
foldr : (a -> b -> b) -> b -> Set a -> b
|
||||||
foldr f b s = Dict.foldr (\k _ b -> f k b) b s
|
foldr f b s = Dict.foldr (\k _ b -> f k b) b s
|
||||||
|
|
||||||
|
-- Map a function onto a set, creating a new set with no duplicates.
|
||||||
map : (a -> b) -> Set a -> Set b
|
map : (a -> b) -> Set a -> Set b
|
||||||
map f s = fromList (List.map f (toList s))
|
map f s = fromList (List.map f (toList s))
|
|
@ -1,12 +1,24 @@
|
||||||
|
|
||||||
|
-- The library for general signal manipulation. Some useful functions for
|
||||||
|
-- working with time (e.g. setting FPS) and combining signals and time (e.g.
|
||||||
|
-- delaying updates, getting timestamps) can be found in the
|
||||||
|
-- [`Time`](/docs/Signal/Time.elm) library.
|
||||||
|
--
|
||||||
|
-- Note: There are lift functions up to `lift8`.
|
||||||
module Signal where
|
module Signal where
|
||||||
|
|
||||||
import Native.Signal as Native
|
import Native.Signal as Native
|
||||||
|
|
||||||
|
-- Create a constant signal that never changes.
|
||||||
constant : a -> Signal a
|
constant : a -> Signal a
|
||||||
|
|
||||||
|
-- Transform a signal with a given function.
|
||||||
lift : (a -> b) -> Signal a -> Signal b
|
lift : (a -> b) -> Signal a -> Signal b
|
||||||
|
|
||||||
|
-- Combine two signals with a given function.
|
||||||
lift2 : (a -> b -> c) -> Signal a -> Signal b -> Signal c
|
lift2 : (a -> b -> c) -> Signal a -> Signal b -> Signal c
|
||||||
|
|
||||||
|
-- Combine three signals with a given function.
|
||||||
lift3 : (a -> b -> c -> d) -> Signal a -> Signal b -> Signal c -> Signal d
|
lift3 : (a -> b -> c -> d) -> Signal a -> Signal b -> Signal c -> Signal d
|
||||||
lift4 : (a -> b -> c -> d -> e) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
|
lift4 : (a -> b -> c -> d -> e) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
|
||||||
lift5 : (a -> b -> c -> d -> e -> f) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f
|
lift5 : (a -> b -> c -> d -> e -> f) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f
|
||||||
|
@ -14,21 +26,98 @@ lift6 : (a -> b -> c -> d -> e -> f -> g) -> Signal a -> Signal b -> Signal c ->
|
||||||
lift7 : (a -> b -> c -> d -> e -> f -> g -> h) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f -> Signal g -> Signal h
|
lift7 : (a -> b -> c -> d -> e -> f -> g -> h) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f -> Signal g -> Signal h
|
||||||
lift8 : (a -> b -> c -> d -> e -> f -> g -> h -> i) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f -> Signal g -> Signal h -> Signal i
|
lift8 : (a -> b -> c -> d -> e -> f -> g -> h -> i) -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f -> Signal g -> Signal h -> Signal i
|
||||||
|
|
||||||
|
-- Create a past-dependent signal. Each value given on the input signal will
|
||||||
|
-- be accumulated, producing a new output value.
|
||||||
|
--
|
||||||
|
-- For instance, `(foldp (\\t acc -> acc + 1) 0 (Time.every second))` increments every second.
|
||||||
foldp : (a -> b -> b) -> b -> Signal a -> Signal b
|
foldp : (a -> b -> b) -> b -> Signal a -> Signal b
|
||||||
|
|
||||||
|
-- Merge two signals into one, biased towards the first signal if both signals
|
||||||
|
-- update at the same time.
|
||||||
merge : Signal a -> Signal a -> Signal a
|
merge : Signal a -> Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Merge many signals into one, biased towards the left-most signal if multiple
|
||||||
|
-- signals update simultaneously.
|
||||||
merges : [Signal a] -> Signal a
|
merges : [Signal a] -> Signal a
|
||||||
|
|
||||||
|
-- Merge two signals into one, but distinguishing the values by marking the first
|
||||||
|
-- signal as `Left` and the second signal as `Right`. This allows you to easily
|
||||||
|
-- fold over non-homogeneous inputs.
|
||||||
mergeEither : Signal a -> Signal b -> Signal (Either a b)
|
mergeEither : Signal a -> Signal b -> Signal (Either a b)
|
||||||
|
|
||||||
|
-- Count the number of events that have occured.
|
||||||
count : Signal a -> Signal Int
|
count : Signal a -> Signal Int
|
||||||
|
|
||||||
|
-- Count the number of events that have occured that satisfy a given predicate.
|
||||||
countIf : (a -> Bool) -> Signal a -> Signal Int
|
countIf : (a -> Bool) -> Signal a -> Signal Int
|
||||||
|
|
||||||
|
-- Keep only events that satisfy the given predicate. Elm does not allow
|
||||||
|
-- undefined signals, so a base case must be provided in case the predicate is
|
||||||
|
-- never satisfied.
|
||||||
keepIf : (a -> Bool) -> a -> Signal a -> Signal a
|
keepIf : (a -> Bool) -> a -> Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Drop events that satisfy the given predicate. Elm does not allow undefined
|
||||||
|
-- signals, so a base case must be provided in case the predicate is never
|
||||||
|
-- satisfied.
|
||||||
dropIf : (a -> Bool) -> a -> Signal a -> Signal a
|
dropIf : (a -> Bool) -> a -> Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Keep events only when the first signal is true. When the first signal becomes
|
||||||
|
-- true, the most recent value of the second signal will be propagated. Until
|
||||||
|
-- the first signal becomes false again, all events will be propagated. Elm does
|
||||||
|
-- not allow undefined signals, so a base case must be provided in case the first
|
||||||
|
-- signal is never true.
|
||||||
keepWhen : Signal Bool -> a -> Signal a -> Signal a
|
keepWhen : Signal Bool -> a -> Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Drop events when the first signal is true. When the first signal becomes false,
|
||||||
|
-- the most recent value of the second signal will be propagated. Until the first
|
||||||
|
-- signal becomes true again, all events will be propagated. Elm does not allow
|
||||||
|
-- undefined signals, so a base case must be provided in case the first signal is
|
||||||
|
-- always true.
|
||||||
dropWhen : Signal Bool -> a -> Signal a -> Signal a
|
dropWhen : Signal Bool -> a -> Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Drop sequential repeated values. For example, if a signal produces the
|
||||||
|
-- sequence `[1,1,2,2,1]`, it becomes `[1,2,1]` by dropping the values that
|
||||||
|
-- are the same as the previous value.
|
||||||
dropRepeats : Signal a -> Signal a
|
dropRepeats : Signal a -> Signal a
|
||||||
|
|
||||||
|
-- Sample from the second input every time an event occurs on the first input.
|
||||||
|
-- For example, `(sampleOn clicks (every second))` will give the approximate
|
||||||
|
-- time of the latest click.
|
||||||
sampleOn : Signal a -> Signal b -> Signal b
|
sampleOn : Signal a -> Signal b -> Signal b
|
||||||
|
|
||||||
|
-- Add a timestamp to any signal. Timestamps increase monotonically. Each timestamp is
|
||||||
|
-- related to a specfic event, so `Mouse.x` and `Mouse.y` will always have the same
|
||||||
|
-- timestamp because they both rely on the same underlying event.
|
||||||
timestamp : Signal a -> Signal (Time, a)
|
timestamp : Signal a -> Signal (Time, a)
|
||||||
|
|
||||||
|
-- Delay a signal by a certain amount of time. So `(delay second Mouse.clicks)`
|
||||||
|
-- will update one second later than any mouse click.
|
||||||
|
delay : Time -> Signal a -> Signal a
|
||||||
|
|
||||||
|
{-- TODO: only found in docs
|
||||||
|
, ("average", "Int -> Signal Number -> Signal Float", [markdown|
|
||||||
|
|
||||||
|
Takes an integer `n` and a signal of numbers. Computes the running
|
||||||
|
average of the signal over the last `n` events.
|
||||||
|
|
||||||
|
So `(average 20 (fps 40))` would be the average time between the frames for
|
||||||
|
the last 20 frames.|])
|
||||||
|
, ("foldp1", "(a -> a -> a) -> Signal a -> Signal a", [markdown|
|
||||||
|
Create a past-dependent signal. The first value on the signal is used
|
||||||
|
as the base case.|])
|
||||||
|
, ("foldp'", "(a -> b -> b) -> (a -> b) -> Signal a -> Signal b", [markdown|
|
||||||
|
Just like foldp, but instead of a base case, you provide a function to be
|
||||||
|
applied to the first value, creating the base case.|])
|
||||||
|
[ ("(<~)", "(a -> b) -> Signal a -> Signal b", [markdown|
|
||||||
|
An alias for `lift`. A prettier way to apply a
|
||||||
|
function to the current value of a signal.|])
|
||||||
|
, ("(~)", "Signal (a -> b) -> Signal a -> Signal b", [markdown|
|
||||||
|
Signal application. This takes two signals, holding a function and
|
||||||
|
a value. It applies the current function to the current value.
|
||||||
|
|
||||||
|
So the following expressions are equivalent:
|
||||||
|
|
||||||
|
scene <~ Mouse.x ~ Mouse.y
|
||||||
|
lift2 scene Mouse.x Mouse.y|])
|
||||||
|
--}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
-- Library for working with time. Type `Time` represents some number of
|
-- Library for working with time. Type `Time` represents some number of milliseconds.
|
||||||
-- milliseconds.
|
|
||||||
|
|
||||||
module Time where
|
module Time where
|
||||||
|
|
||||||
import Native.Time as T
|
import Native.Time as T
|
||||||
|
@ -50,3 +48,15 @@ fpsWhen : Number -> Signal Bool -> Signal Time
|
||||||
-- Takes a time interval t. The resulting signal is the current time,
|
-- Takes a time interval t. The resulting signal is the current time,
|
||||||
-- updated every t.
|
-- updated every t.
|
||||||
every : Time -> Signal Time
|
every : Time -> Signal Time
|
||||||
|
|
||||||
|
-- Takes a time `t` and any signal. The resulting boolean signal
|
||||||
|
-- is true for time `t` after every event on the input signal.
|
||||||
|
-- So ``(second `since` Mouse.clicks)`` would result in a signal
|
||||||
|
-- that is true for one second after each mouse click and false
|
||||||
|
-- otherwise.
|
||||||
|
since : Time -> Signal a -> Signal Bool
|
||||||
|
|
||||||
|
{-- TODO: Only found in docs
|
||||||
|
, ("timeOf", "Signal a -> Signal Time", [markdown|
|
||||||
|
Same as `timestamp` but it throws out the incoming value. So `(timeOf == lift fst . timestamp)`.|])
|
||||||
|
--}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
-- This is an early version of the touch library. It will likely grow to
|
-- This is an early version of the touch library. It will likely grow to
|
||||||
-- include gestures that would be useful for both games and web-pages.
|
-- include gestures that would be useful for both games and web-pages.
|
||||||
|
|
||||||
module Touch where
|
module Touch where
|
||||||
|
|
||||||
import Native.Touch as T
|
import Native.Touch as T
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
-- A library for low latency HTTP communication. See the HTTP library for
|
-- A library for low latency HTTP communication. See the HTTP library for
|
||||||
-- standard requests like GET, POST, etc.
|
-- standard requests like GET, POST, etc.
|
||||||
|
|
||||||
module WebSocket where
|
module WebSocket where
|
||||||
|
|
||||||
import Native.WebSocket as WS
|
import Native.WebSocket as WS
|
||||||
|
|
Loading…
Reference in a new issue