module JavaScript.Array
( SomeJSArray(..)
, JSArray
, MutableJSArray
, create
, length
, lengthIO
, null
, fromList
, fromListIO
, toList
, toListIO
, index, (!)
, read
, write
, append
, push
, pop
, unshift
, shift
, reverse
, take
, takeIO
, drop
, dropIO
, slice
, sliceIO
, freeze
, unsafeFreeze
, thaw
, unsafeThaw
) where
import Prelude hiding (length, drop, read, take, reverse, null)
import Control.Monad (void)
import Language.Javascript.JSaddle.Types
(JSM, JSVal, SomeJSArray(..), JSArray,
MutableJSArray, GHCJSPure(..))
import Control.Lens.Operators ((^.))
import Language.Javascript.JSaddle.Object (js2, js0, (<##), js1, js)
import Language.Javascript.JSaddle.Value (valToNumber)
import JavaScript.Array.Internal (create, fromList, fromListIO, toList, toListIO, index, read, push)
length :: SomeJSArray m -> GHCJSPure Int
length :: forall (m :: MutabilityType (*)). SomeJSArray m -> GHCJSPure Int
length = JSM Int -> GHCJSPure Int
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Int -> GHCJSPure Int)
-> (SomeJSArray m -> JSM Int) -> SomeJSArray m -> GHCJSPure Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeJSArray m -> JSM Int
forall (m :: MutabilityType (*)). SomeJSArray m -> JSM Int
lengthIO
{-# INLINE length #-}
lengthIO :: SomeJSArray m -> JSM Int
lengthIO :: forall (m :: MutabilityType (*)). SomeJSArray m -> JSM Int
lengthIO (SomeJSArray JSVal
x) = Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Double -> Int) -> JSM Double -> JSM Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> IndexPreservingGetter JSVal (JSM JSVal)
forall s name.
(MakeObject s, ToJSString name) =>
name -> IndexPreservingGetter s (JSM JSVal)
js String
"length" JSM JSVal -> (JSVal -> JSM Double) -> JSM Double
forall a b. JSM a -> (a -> JSM b) -> JSM b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSVal -> JSM Double
forall value. ToJSVal value => value -> JSM Double
valToNumber)
{-# INLINE lengthIO #-}
null :: SomeJSArray m -> GHCJSPure Bool
null :: forall (m :: MutabilityType (*)). SomeJSArray m -> GHCJSPure Bool
null = JSM Bool -> GHCJSPure Bool
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM Bool -> GHCJSPure Bool)
-> (SomeJSArray m -> JSM Bool) -> SomeJSArray m -> GHCJSPure Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Bool) -> JSM Int -> JSM Bool
forall a b. (a -> b) -> JSM a -> JSM b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) (JSM Int -> JSM Bool)
-> (SomeJSArray m -> JSM Int) -> SomeJSArray m -> JSM Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeJSArray m -> JSM Int
forall (m :: MutabilityType (*)). SomeJSArray m -> JSM Int
lengthIO
{-# INLINE null #-}
append :: SomeJSArray m -> SomeJSArray m -> JSM (SomeJSArray m1)
append :: forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
SomeJSArray m -> SomeJSArray m -> JSM (SomeJSArray m1)
append (SomeJSArray JSVal
x) (SomeJSArray JSVal
y) = JSVal -> SomeJSArray m1
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> SomeJSArray m1) -> JSM JSVal -> JSM (SomeJSArray m1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> JSVal -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 String
"concat" JSVal
y
{-# INLINE append #-}
write :: Int -> JSVal -> MutableJSArray -> JSM ()
write :: Int -> JSVal -> MutableJSArray -> JSM ()
write Int
n JSVal
e (SomeJSArray JSVal
x) = JSM () -> JSM ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (JSM () -> JSM ()) -> JSM () -> JSM ()
forall a b. (a -> b) -> a -> b
$ (JSVal
x JSVal -> Int -> JSVal -> JSM ()
forall this val.
(MakeObject this, ToJSVal val) =>
this -> Int -> val -> JSM ()
<## Int
n) JSVal
e
{-# INLINE write #-}
pop :: MutableJSArray -> JSM JSVal
pop :: MutableJSArray -> JSM JSVal
pop (SomeJSArray JSVal
x) = JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> JSF
forall name. ToJSString name => name -> JSF
js0 String
"pop"
{-# INLINE pop #-}
unshift :: JSVal -> MutableJSArray -> JSM ()
unshift :: JSVal -> MutableJSArray -> JSM ()
unshift JSVal
e (SomeJSArray JSVal
x) = JSM JSVal -> JSM ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (JSM JSVal -> JSM ()) -> JSM JSVal -> JSM ()
forall a b. (a -> b) -> a -> b
$ JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> JSVal -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 String
"unshift" JSVal
e
{-# INLINE unshift #-}
shift :: MutableJSArray -> JSM JSVal
shift :: MutableJSArray -> JSM JSVal
shift (SomeJSArray JSVal
x) = JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> JSF
forall name. ToJSString name => name -> JSF
js0 String
"shift"
{-# INLINE shift #-}
reverse :: MutableJSArray -> JSM ()
reverse :: MutableJSArray -> JSM ()
reverse (SomeJSArray JSVal
x) = JSM JSVal -> JSM ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (JSM JSVal -> JSM ()) -> JSM JSVal -> JSM ()
forall a b. (a -> b) -> a -> b
$ JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> JSF
forall name. ToJSString name => name -> JSF
js0 String
"reverse"
{-# INLINE reverse #-}
take :: Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)
take :: forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)
take Int
n = JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1)
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1))
-> (SomeJSArray m -> JSM (SomeJSArray m1))
-> SomeJSArray m
-> GHCJSPure (SomeJSArray m1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> SomeJSArray m -> JSM (SomeJSArray m1)
forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> JSM (SomeJSArray m1)
takeIO Int
n
{-# INLINE take #-}
takeIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1)
takeIO :: forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> JSM (SomeJSArray m1)
takeIO Int
n (SomeJSArray JSVal
x) = JSVal -> SomeJSArray m1
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> SomeJSArray m1) -> JSM JSVal -> JSM (SomeJSArray m1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> Int -> Int -> JSF
forall name a0 a1.
(ToJSString name, ToJSVal a0, ToJSVal a1) =>
name -> a0 -> a1 -> JSF
js2 String
"slice" (Int
0::Int) Int
n
{-# INLINE takeIO #-}
drop :: Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)
drop :: forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> GHCJSPure (SomeJSArray m1)
drop Int
n = JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1)
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1))
-> (SomeJSArray m -> JSM (SomeJSArray m1))
-> SomeJSArray m
-> GHCJSPure (SomeJSArray m1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> SomeJSArray m -> JSM (SomeJSArray m1)
forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> JSM (SomeJSArray m1)
dropIO Int
n
{-# INLINE drop #-}
dropIO :: Int -> SomeJSArray m -> JSM (SomeJSArray m1)
dropIO :: forall (m :: MutabilityType (*)) (m1 :: MutabilityType (*)).
Int -> SomeJSArray m -> JSM (SomeJSArray m1)
dropIO Int
n (SomeJSArray JSVal
x) = JSVal -> SomeJSArray m1
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> SomeJSArray m1) -> JSM JSVal -> JSM (SomeJSArray m1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> Int -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 String
"slice1" Int
n
{-# INLINE dropIO #-}
slice :: Int -> Int -> JSArray -> GHCJSPure (SomeJSArray m1)
slice :: forall (m1 :: MutabilityType (*)).
Int -> Int -> JSArray -> GHCJSPure (SomeJSArray m1)
slice Int
s Int
n = JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1)
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM (SomeJSArray m1) -> GHCJSPure (SomeJSArray m1))
-> (JSArray -> JSM (SomeJSArray m1))
-> JSArray
-> GHCJSPure (SomeJSArray m1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> JSArray -> JSM (SomeJSArray m1)
forall (m1 :: MutabilityType (*)).
Int -> Int -> JSArray -> JSM (SomeJSArray m1)
sliceIO Int
s Int
n
{-# INLINE slice #-}
sliceIO :: Int -> Int -> JSArray -> JSM (SomeJSArray m1)
sliceIO :: forall (m1 :: MutabilityType (*)).
Int -> Int -> JSArray -> JSM (SomeJSArray m1)
sliceIO Int
s Int
n (SomeJSArray JSVal
x) = JSVal -> SomeJSArray m1
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> SomeJSArray m1) -> JSM JSVal -> JSM (SomeJSArray m1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> Int -> Int -> JSF
forall name a0 a1.
(ToJSString name, ToJSVal a0, ToJSVal a1) =>
name -> a0 -> a1 -> JSF
js2 String
"slice" Int
s Int
n
{-# INLINE sliceIO #-}
freeze :: MutableJSArray -> JSM JSArray
freeze :: MutableJSArray -> JSM JSArray
freeze (SomeJSArray JSVal
x) = JSVal -> JSArray
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> JSArray) -> JSM JSVal -> JSM JSArray
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> Int -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 String
"slice" (Int
0::Int)
{-# INLINE freeze #-}
unsafeFreeze :: MutableJSArray -> JSM JSArray
unsafeFreeze :: MutableJSArray -> JSM JSArray
unsafeFreeze (SomeJSArray JSVal
x) = JSArray -> JSM JSArray
forall a. a -> JSM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (JSVal -> JSArray
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray JSVal
x)
{-# INLINE unsafeFreeze #-}
thaw :: JSArray -> JSM MutableJSArray
thaw :: JSArray -> JSM MutableJSArray
thaw (SomeJSArray JSVal
x) = JSVal -> MutableJSArray
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray (JSVal -> MutableJSArray) -> JSM JSVal -> JSM MutableJSArray
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JSVal
x JSVal -> Getting (JSM JSVal) JSVal (JSM JSVal) -> JSM JSVal
forall s a. s -> Getting a s a -> a
^. String -> Int -> JSF
forall name a0. (ToJSString name, ToJSVal a0) => name -> a0 -> JSF
js1 String
"slice" (Int
0::Int)
{-# INLINE thaw #-}
unsafeThaw :: JSArray -> JSM MutableJSArray
unsafeThaw :: JSArray -> JSM MutableJSArray
unsafeThaw (SomeJSArray JSVal
x) = MutableJSArray -> JSM MutableJSArray
forall a. a -> JSM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (JSVal -> MutableJSArray
forall s (m :: MutabilityType s). JSVal -> SomeJSArray m
SomeJSArray JSVal
x)
{-# INLINE unsafeThaw #-}
(!) :: JSArray -> Int -> GHCJSPure JSVal
JSArray
x ! :: JSArray -> Int -> GHCJSPure JSVal
! Int
n = JSM JSVal -> GHCJSPure JSVal
forall a. JSM a -> GHCJSPure a
GHCJSPure (JSM JSVal -> GHCJSPure JSVal) -> JSM JSVal -> GHCJSPure JSVal
forall a b. (a -> b) -> a -> b
$ Int -> JSArray -> JSM JSVal
forall (m :: MutabilityType (*)). Int -> SomeJSArray m -> JSM JSVal
read Int
n JSArray
x
{-# INLINE (!) #-}