HJScript-0.4.5: src/HJScript/Objects/Array.hs
{-# LANGUAGE OverlappingInstances, UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : HJScript.Objects.Array
-- License : BSD-style
-- Maintainer : Joel Bjornson joel.bjornson@gmail.com
-- Niklas Broberg nibro@cs.chalmers.se
-- Stability : experimental
-----------------------------------------------------------------------------
module HJScript.Objects.Array
(
-- Properties
arrLength,
-- Methods
push, headArr, mapArray, mapArrayH, mapArrayH_, foreach, filterArray
) where
import HJScript.Lang
-- | Constructors for Array
instance HasConstructor (Array t) () ()
instance HasConstructor (Array t) (JInt) Int
headArr :: JArray t -> Var t
headArr arr = arr #! (int 0)
-- | Properties for Array
arrLength :: JArray t -> JInt
arrLength = deref "length"
-- | Methods on array
push :: Exp t -> JArray t -> HJScript ()
push arg = callVoidMethod "push" arg
-- | Map array
mapArray :: (Exp t1 -> Exp t2) -> JArray t1 -> HJScript (JArray t2)
mapArray fun arr = do
retArr <- new Array ()
for (int 0) (arrLength arr .-. (int 1)) $ \index -> do
let elem = fun $ val (arr #! index)
retArr # push elem
return retArr
-- | mapArrayH
mapArrayH :: (Exp t1 -> HJScript (Exp t2)) ->
JArray t1 ->
HJScript (JArray t2)
mapArrayH fun arr = do
retArr <- new Array ()
for (int 0) (arrLength arr .-. (int 1)) $ \index -> do
elem <- fun $ val (arr #! index)
retArr # push elem
return retArr
-- | Throw away produced value.
mapArrayH_ :: (Exp t1 -> HJScript t2) -> JArray t1 -> HJScript ()
mapArrayH_ fun arr =
for (int 0) (arrLength arr .-. (int 1)) $ \index -> fun $ val (arr #! index)
-- | Synonym for mapArrayH_
foreach :: JArray t1 -> (Exp t1 -> HJScript t2) -> HJScript ()
foreach = flip mapArrayH_
-- | Select array elements with a condition.
filterArray :: (Exp t -> JBool) -> JArray t -> HJScript (JArray t)
filterArray cond elems = do
arr <- new Array ()
foreach elems $ maybeAdd arr
return arr
where
maybeAdd arr elem =
doIfNoElse (elem # cond) $
arr # push elem