Merge branch 'dev' of https://github.com/evancz/Elm into dev
This commit is contained in:
commit
964250c3c2
6 changed files with 213 additions and 119 deletions
|
@ -1,9 +1,17 @@
|
|||
|
||||
-- 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
|
||||
|
||||
{-| Library for working with dates. Email the mailing list if you encounter
|
||||
issues with internationalization or locale formatting.
|
||||
|
||||
# Conversions
|
||||
@docs read, toTime
|
||||
|
||||
# Extractions
|
||||
@docs year, month, Month, day, dayOfWeek, Day, hour, minute, second
|
||||
|
||||
-}
|
||||
|
||||
import Basics (String)
|
||||
import Native.Date
|
||||
import Time (Time)
|
||||
|
@ -11,55 +19,55 @@ import Maybe (Maybe)
|
|||
|
||||
data Date = Date
|
||||
|
||||
-- Represents the days of the week.
|
||||
{-| Represents the days of the week. -}
|
||||
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
|
||||
|
||||
-- Represents the month of the year.
|
||||
{-| Represents the month of the year. -}
|
||||
data Month = Jan | Feb | Mar | Apr
|
||||
| May | Jun | Jul | Aug
|
||||
| Sep | Oct | Nov | Dec
|
||||
|
||||
-- Attempt to read a date from a string.
|
||||
{-| Attempt to read a date from a string. -}
|
||||
read : String -> Maybe Date
|
||||
read = Native.Date.read
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Date.toTime
|
||||
|
||||
-- Extract the year of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the integer `1990`.
|
||||
{-| 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 = Native.Date.year
|
||||
|
||||
-- Extract the month of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the Month `Jun` as defined below.
|
||||
{-| 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 = Native.Date.month
|
||||
|
||||
-- Extract the day of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the integer `23`.
|
||||
{-| 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 = Native.Date.day
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Date.dayOfWeek
|
||||
|
||||
-- Extract the hour of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the integer `11`.
|
||||
{-| 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 = Native.Date.hour
|
||||
|
||||
-- Extract the minute of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the integer `45`.
|
||||
{-| 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 = Native.Date.minute
|
||||
|
||||
-- Extract the second of a given date. Given the date 23 June 1990 at 11:45AM
|
||||
-- this returns the integer `0`.
|
||||
{-| 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 = Native.Date.second
|
||||
second = Native.Date.second
|
||||
|
|
|
@ -1,51 +1,76 @@
|
|||
|
||||
module Either where
|
||||
|
||||
{-| Represents any data that can take two different types.
|
||||
|
||||
# Type and Constructors
|
||||
@docs Either, Left, Right
|
||||
|
||||
# Taking Eithers apart
|
||||
@docs either, isLeft, isRight
|
||||
|
||||
# Eithers and Lists
|
||||
@docs lefts, rights, partition, consLeft, consRight, consEither
|
||||
|
||||
-}
|
||||
|
||||
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.
|
||||
{-| 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
|
||||
|
||||
-- Apply the first function to a `Left` and the second function to a `Right`.
|
||||
-- This allows the extraction of a value from an `Either`.
|
||||
{-| 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 f g e = case e of { Left x -> f x ; Right y -> g y }
|
||||
|
||||
-- True if the value is a `Left`.
|
||||
{-| True if the value is a `Left`. -}
|
||||
isLeft : Either a b -> Bool
|
||||
isLeft e = case e of { Left _ -> True ; _ -> False }
|
||||
|
||||
-- True if the value is a `Right`.
|
||||
{-| True if the value is a `Right`. -}
|
||||
isRight : Either a b -> Bool
|
||||
isRight e = case e of { Right _ -> True ; _ -> False }
|
||||
|
||||
-- Keep only the values held in `Left` values.
|
||||
{-| Keep only the values held in `Left` values. -}
|
||||
lefts : [Either a b] -> [a]
|
||||
lefts es = List.foldr consLeft [] es
|
||||
|
||||
-- Keep only the values held in `Right` values.
|
||||
{-| Keep only the values held in `Right` values. -}
|
||||
rights : [Either a b] -> [b]
|
||||
rights es = List.foldr consRight [] 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))`
|
||||
{-| 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 es = List.foldr consEither ([],[]) es
|
||||
|
||||
{-| If `Left`, add the value to the front of the list.
|
||||
If `Right`, return the list unchanged
|
||||
-}
|
||||
consLeft : Either a b -> [a] -> [a]
|
||||
consLeft e vs =
|
||||
case e of
|
||||
Left v -> v::vs
|
||||
Right _ -> vs
|
||||
|
||||
{-| If `Right`, add the value to the front of the list.
|
||||
If `Left`, return the list unchanged.
|
||||
-}
|
||||
consRight : Either a b -> [b] -> [b]
|
||||
consRight e vs =
|
||||
case e of
|
||||
Left _ -> vs
|
||||
Right v -> v::vs
|
||||
|
||||
{-| If `Left`, add the value to the left list.
|
||||
If `Right`, add the value to the right list.
|
||||
-}
|
||||
consEither : Either a b -> ([a], [b]) -> ([a], [b])
|
||||
consEither e (ls,rs) =
|
||||
case e of
|
||||
Left l -> (l::ls,rs)
|
||||
|
|
|
@ -1,34 +1,52 @@
|
|||
|
||||
module Maybe where
|
||||
|
||||
{-| Represents an optional value.
|
||||
|
||||
# Type and Constructors
|
||||
@docs Maybe, Just, Nothing
|
||||
|
||||
# Taking Maybes apart
|
||||
@docs maybe, isJust, isNothing
|
||||
|
||||
# Maybes and Lists
|
||||
@docs cons, justs
|
||||
-}
|
||||
|
||||
import Basics (not, (.))
|
||||
import List (foldr)
|
||||
|
||||
-- The Maybe datatype. Useful when a computation may or may not
|
||||
-- result in a value (e.g. logarithm is defined only for positive numbers).
|
||||
{-| The Maybe datatype. Useful when a computation may or may not
|
||||
result in a value (e.g. logarithm is defined only for positive
|
||||
numbers).
|
||||
-}
|
||||
data Maybe a = Just a | Nothing
|
||||
|
||||
-- Apply a function to the contents of a `Maybe`.
|
||||
-- Return default when given `Nothing`.
|
||||
{-| Apply a function to the contents of a `Maybe`.
|
||||
Return default when given `Nothing`.
|
||||
-}
|
||||
maybe : b -> (a -> b) -> Maybe a -> b
|
||||
maybe b f m = case m of
|
||||
Just v -> f v
|
||||
Nothing -> b
|
||||
|
||||
-- Check if constructed with `Just`.
|
||||
{-| Check if constructed with `Just`.
|
||||
-}
|
||||
isJust : Maybe a -> Bool
|
||||
isJust = maybe False (\_ -> True)
|
||||
|
||||
-- Check if constructed with `Nothing`.
|
||||
{-| Check if constructed with `Nothing`.
|
||||
-}
|
||||
isNothing : Maybe a -> Bool
|
||||
isNothing = not . isJust
|
||||
|
||||
|
||||
-- If `Just`, adds the value to the front of the list.
|
||||
-- If `Nothing`, list is unchanged.
|
||||
{-| If `Just`, adds the value to the front of the list.
|
||||
If `Nothing`, list is unchanged.
|
||||
-}
|
||||
cons : Maybe a -> [a] -> [a]
|
||||
cons mx xs = maybe xs (\x -> x :: xs) mx
|
||||
|
||||
-- Filters out Nothings and extracts the remaining values.
|
||||
{-| Filters out Nothings and extracts the remaining values.
|
||||
-}
|
||||
justs : [Maybe a] -> [a]
|
||||
justs = foldr cons []
|
||||
|
|
|
@ -1,31 +1,41 @@
|
|||
|
||||
module Mouse where
|
||||
|
||||
{-| Library for working with mouse input.
|
||||
|
||||
# Position
|
||||
@docs position, x, y
|
||||
|
||||
# Button Status
|
||||
@docs isDown, clicks, isClicked
|
||||
|
||||
-}
|
||||
|
||||
import Signal (Signal)
|
||||
import Native.Mouse
|
||||
|
||||
-- The current mouse position.
|
||||
{-| The current mouse position. -}
|
||||
position : Signal (Int,Int)
|
||||
position = Native.Mouse.position
|
||||
|
||||
-- The current x-coordinate of the mouse.
|
||||
{-| The current x-coordinate of the mouse. -}
|
||||
x : Signal Int
|
||||
x = Native.Mouse.x
|
||||
|
||||
-- The current y-coordinate of the mouse.
|
||||
{-| The current y-coordinate of the mouse. -}
|
||||
y : Signal Int
|
||||
y = Native.Mouse.y
|
||||
|
||||
-- The current state of the left mouse-button.
|
||||
-- True when the button is down, and false otherwise.
|
||||
{-| The current state of the left mouse-button.
|
||||
True when the button is down, and false otherwise. -}
|
||||
isDown : Signal Bool
|
||||
isDown = Native.Mouse.isDown
|
||||
|
||||
-- True immediately after the left mouse-button has been clicked,
|
||||
-- and false otherwise.
|
||||
{-| True immediately after the left mouse-button has been clicked,
|
||||
and false otherwise. -}
|
||||
isClicked : Signal Bool
|
||||
isClicked = Native.Mouse.isClicked
|
||||
|
||||
-- Always equal to unit. Event triggers on every mouse click.
|
||||
{-| Always equal to unit. Event triggers on every mouse click. -}
|
||||
clicks : Signal ()
|
||||
clicks = Native.Mouse.clicks
|
||||
clicks = Native.Mouse.clicks
|
||||
|
|
|
@ -1,32 +1,52 @@
|
|||
|
||||
-- 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`.
|
||||
{-| The library for general signal manipulation. Includes lift functions up to
|
||||
`lift8` and infix lift operators `<~` and `~`, combinations, filters, and
|
||||
past-dependence.
|
||||
|
||||
Signals are time-varying values. Lifted functions are reevaluated whenver any of
|
||||
their input signals has an event. Signal events may be of the same value as the
|
||||
previous value of the signal. Such signals are useful for timing and
|
||||
past-dependence.
|
||||
|
||||
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.
|
||||
|
||||
# Combine
|
||||
@docs constant, lift, lift2, merge, merges, combine
|
||||
|
||||
# Pretty Lift
|
||||
@docs (<~), (~)
|
||||
|
||||
# Past-Dependence
|
||||
@docs foldp, count, countIf
|
||||
|
||||
#Filters
|
||||
@docs keepIf, dropIf, keepWhen, dropWhen, dropRepeats, sampleOn
|
||||
|
||||
# Do you even lift?
|
||||
@docs lift3, lift4, lift5, lift6, lift7, lift8
|
||||
|
||||
-}
|
||||
module Signal where
|
||||
|
||||
import Native.Signal
|
||||
import List (foldr)
|
||||
|
||||
data Signal a = Signal
|
||||
-- = Constant a
|
||||
-- | Lift (a -> a) (Signal a)
|
||||
|
||||
-- Create a constant signal that never changes.
|
||||
{-| Create a constant signal that never changes. -}
|
||||
constant : a -> Signal a
|
||||
constant = Native.Signal.constant
|
||||
|
||||
-- Transform a signal with a given function.
|
||||
{-| Transform a signal with a given function. -}
|
||||
lift : (a -> b) -> Signal a -> Signal b
|
||||
lift = Native.Signal.lift
|
||||
|
||||
-- Combine two signals with a given function.
|
||||
{-| Combine two signals with a given function. -}
|
||||
lift2 : (a -> b -> c) -> Signal a -> Signal b -> Signal c
|
||||
lift2 = Native.Signal.lift2
|
||||
|
||||
-- Combine three signals with a given function.
|
||||
lift3 : (a -> b -> c -> d) -> Signal a -> Signal b -> Signal c -> Signal d
|
||||
lift3 = Native.Signal.lift3
|
||||
|
||||
|
@ -49,25 +69,25 @@ lift8 : (a -> b -> c -> d -> e -> f -> g -> h -> i)
|
|||
lift8 = Native.Signal.lift8
|
||||
|
||||
|
||||
-- Create a past-dependent signal. Each value given on the input signal will
|
||||
-- be accumulated, producing a new output value.
|
||||
--
|
||||
-- For instance, `(foldp (\\arrows number -> number + arrows.y) 0 Keyboard.arrows)`
|
||||
-- increments or decrements the accumulated value (which starts at zero) when the up or down arrow keys are pressed.
|
||||
{-| Create a past-dependent signal. Each value given on the input signal will
|
||||
be accumulated, producing a new output value.
|
||||
|
||||
For instance, `foldp (+) 0 (fps 40)` is the time the program has been running,
|
||||
updated 40 times a second. -}
|
||||
foldp : (a -> b -> b) -> b -> Signal a -> Signal b
|
||||
foldp = Native.Signal.foldp
|
||||
|
||||
-- Merge two signals into one, biased towards the first signal if both signals
|
||||
-- update at the same time.
|
||||
{-| 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 = Native.Signal.merge
|
||||
|
||||
-- Merge many signals into one, biased towards the left-most signal if multiple
|
||||
-- signals update simultaneously.
|
||||
{-| Merge many signals into one, biased towards the left-most signal if multiple
|
||||
signals update simultaneously. -}
|
||||
merges : [Signal a] -> Signal a
|
||||
merges = Native.Signal.merges
|
||||
|
||||
-- Combine a list of signals into a signal of lists.
|
||||
{-| Combine a list of signals into a signal of lists. -}
|
||||
combine : [Signal a] -> Signal [a]
|
||||
combine = foldr (Native.Signal.lift2 (::)) (Native.Signal.constant [])
|
||||
|
||||
|
@ -76,70 +96,74 @@ combine = foldr (Native.Signal.lift2 (::)) (Native.Signal.constant [])
|
|||
-- fold over non-homogeneous inputs.
|
||||
-- mergeEither : Signal a -> Signal b -> Signal (Either a b)
|
||||
|
||||
-- Count the number of events that have occured.
|
||||
{-| Count the number of events that have occured. -}
|
||||
count : Signal a -> Signal Int
|
||||
count = Native.Signal.count
|
||||
|
||||
-- Count the number of events that have occured that satisfy a given predicate.
|
||||
{-| Count the number of events that have occured that satisfy a given predicate.
|
||||
-}
|
||||
countIf : (a -> Bool) -> Signal a -> Signal Int
|
||||
countIf = Native.Signal.countIf
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.keepIf
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.dropIf
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.keepWhen
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.dropWhen
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.dropRepeats
|
||||
|
||||
-- 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.
|
||||
{-| 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 = Native.Signal.sampleOn
|
||||
|
||||
-- An alias for `lift`. A prettier way to apply a
|
||||
-- function to the current value of a signal.
|
||||
--
|
||||
-- lift f signal == f <~ signal
|
||||
{-| An alias for `lift`. A prettier way to apply a function to the current value
|
||||
of a signal. -}
|
||||
(<~) : (a -> b) -> Signal a -> Signal b
|
||||
f <~ s = Native.Signal.lift f s
|
||||
|
||||
-- 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 <~ Window.dimensions ~ Mouse.position
|
||||
-- lift2 scene Window.dimensions Mouse.position
|
||||
{-| Informally, an alias for `liftN`. Intersperse it between additional signal
|
||||
arguments of the lifted function.
|
||||
|
||||
Formally, signal application. This takes two signals, holding a function and
|
||||
a value. It applies the current function to the current value.
|
||||
|
||||
The following expressions are equivalent:
|
||||
|
||||
scene <~ Window.dimensions ~ Mouse.position
|
||||
lift2 scene Window.dimensions Mouse.position
|
||||
-}
|
||||
|
||||
(~) : Signal (a -> b) -> Signal a -> Signal b
|
||||
sf ~ s = Native.Signal.lift2 (\f x -> f x) sf s
|
||||
|
||||
infixl 4 <~
|
||||
infixl 4 ~
|
||||
infixl 4 ~
|
||||
|
|
|
@ -1,18 +1,27 @@
|
|||
|
||||
module Window where
|
||||
|
||||
{-| Provides information about the container that your Elm program lives in.
|
||||
When you embed Elm in a `<div>` it gives the dimensions of the container, not
|
||||
the whole window.
|
||||
|
||||
# Dimensions
|
||||
@docs dimensions, width, height
|
||||
|
||||
-}
|
||||
|
||||
import Signal (Signal)
|
||||
import Native.Window
|
||||
|
||||
-- The current dimensions of the window (i.e. the area viewable to the
|
||||
-- user, not including scroll bars).
|
||||
{-| The current width and height of the window (i.e. the area viewable to the
|
||||
user, not including scroll bars). -}
|
||||
dimensions : Signal (Int,Int)
|
||||
dimensions = Native.Window.dimensions
|
||||
|
||||
-- The current width of the window.
|
||||
{-| The current width of the window. -}
|
||||
width : Signal Int
|
||||
width = Native.Window.width
|
||||
|
||||
-- The current height of the window.
|
||||
{-| The current height of the window. -}
|
||||
height : Signal Int
|
||||
height = Native.Window.height
|
||||
|
|
Loading…
Reference in a new issue