Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-hslua-objectorientation for 
openSUSE:Factory checked in at 2022-02-11 23:09:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-hslua-objectorientation (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-hslua-objectorientation.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-hslua-objectorientation"

Fri Feb 11 23:09:08 2022 rev:2 rq:953480 version:2.1.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/ghc-hslua-objectorientation/ghc-hslua-objectorientation.changes
  2021-11-11 21:37:54.588953757 +0100
+++ 
/work/SRC/openSUSE:Factory/.ghc-hslua-objectorientation.new.1956/ghc-hslua-objectorientation.changes
        2022-02-11 23:11:02.407228941 +0100
@@ -1,0 +2,9 @@
+Fri Feb  4 12:15:14 UTC 2022 - [email protected]
+
+- Update hslua-objectorientation to version 2.1.0.
+  Upstream has edited the change log file since the last release in
+  a non-trivial way, i.e. they did more than just add a new entry
+  at the top. You can review the file at:
+  
http://hackage.haskell.org/package/hslua-objectorientation-2.1.0/src/CHANGELOG.md
+
+-------------------------------------------------------------------

Old:
----
  hslua-objectorientation-2.0.1.tar.gz

New:
----
  hslua-objectorientation-2.1.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-hslua-objectorientation.spec ++++++
--- /var/tmp/diff_new_pack.tOTbMs/_old  2022-02-11 23:11:02.807230099 +0100
+++ /var/tmp/diff_new_pack.tOTbMs/_new  2022-02-11 23:11:02.823230145 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-hslua-objectorientation
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %global pkg_name hslua-objectorientation
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        2.0.1
+Version:        2.1.0
 Release:        0
 Summary:        Object orientation tools for HsLua
 License:        MIT

++++++ hslua-objectorientation-2.0.1.tar.gz -> 
hslua-objectorientation-2.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-objectorientation-2.0.1/CHANGELOG.md 
new/hslua-objectorientation-2.1.0/CHANGELOG.md
--- old/hslua-objectorientation-2.0.1/CHANGELOG.md      2001-09-09 
03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/CHANGELOG.md      2001-09-09 
03:46:40.000000000 +0200
@@ -1,21 +1,49 @@
 # Changelog
 
-`hslua-objectorientation` uses [PVP Versioning][1].
+`hslua-objectorientation` uses [PVP Versioning][].
 
-## hslua-objectorientation 2.0.1
+## hslua-objectorientation-2.1.0
 
-Release 2021-11-04.
+Released 29-01-2022.
 
-  - Excludes absent properties from `pairs`: Properties that are
+-   Allow integers as aliases: Aliases can now be of type
+    `AliasIndex`, so integers can now be defined as aliases for
+    other properties. The function `alias` now takes an
+    `AliasIndex` instead of a `Name`; the change entails
+    modifications to the types `UDTypeWithList`, `UDType`, and
+    `Member`. Also, `AliasIndex` is made into an instance of the
+    Eq and Ord type classes.
+
+-   Reworked list representation of objects, allowing write access
+    to list components.
+
+    The `ListSpec` type has been updated and contains now a pair
+    of pairs, where the inner pairs define how to push and
+    retrieve lists, respectively. Users of the `deftypeGeneric'`
+    function will have to update their code.
+
+-   Fixed some integer type declarations in C code. Some variables
+    had been given incorrect types, like `int` instead of
+    `lua_Integer`. They are usually the same, but may differ in
+    some setups.
+
+-   Require hslua-core-2.1.0 and hslua-marshalling-2.1.0, or
+    later.
+
+## hslua-objectorientation-2.0.1
+
+Released 2021-11-04.
+
+-   Excludes absent properties from `pairs`: Properties that are
     optional and not present in a sum-type value are no longer
     included in the iterator output produced by `pairs` (i.e., the
     `__pairs` metamethod). Previously, the names of absent
     properties were pushed with a `nil` value.
 
-## hslua-objectorientation 2.0.0
+## hslua-objectorientation-2.0.0
 
-Release 2021-10-21.
+Released 2021-10-21.
 
-- Published without warning.
+-   Published without warning.
 
-[1]: https://pvp.haskell.org
+  [PVP Versioning]: https://pvp.haskell.org
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-objectorientation-2.0.1/LICENSE 
new/hslua-objectorientation-2.1.0/LICENSE
--- old/hslua-objectorientation-2.0.1/LICENSE   2001-09-09 03:46:40.000000000 
+0200
+++ new/hslua-objectorientation-2.1.0/LICENSE   2001-09-09 03:46:40.000000000 
+0200
@@ -1,7 +1,7 @@
 Copyright ?? 1994-2020 Lua.org, PUC-Rio.
 Copyright ?? 2007-2012 Gracjan Polak
 Copyright ?? 2012-2015 ??mer Sinan A??acan
-Copyright ?? 2016-2021 Albert Krewinkel
+Copyright ?? 2016-2022 Albert Krewinkel
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-objectorientation-2.0.1/cbits/hslobj.c 
new/hslua-objectorientation-2.1.0/cbits/hslobj.c
--- old/hslua-objectorientation-2.0.1/cbits/hslobj.c    2001-09-09 
03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/cbits/hslobj.c    2001-09-09 
03:46:40.000000000 +0200
@@ -89,14 +89,16 @@
   }
   lua_pushvalue(L, 2);
   if (lua_rawget(L, -2) != LUA_TTABLE) {
-    return 0;             /* key is not an alias */
+    lua_pop(L, 2);       /* key is not an alias */
+    return 0;            /* try a different method */
   }
 
   /* key is an alias */
   lua_pushvalue(L, 1);    /* start with the original object */
   /* Iterate over properties; last object is on top of stack,
    * list of properties is the second object. */
-  for (int i = 1; i <= lua_rawlen(L, -2); i++) {
+  lua_Integer len = (lua_Integer) lua_rawlen(L, -2);
+  for (lua_Integer i = 1; i <= len; i++) {
     lua_rawgeti(L, -2, i);
     int objtype = lua_gettable(L, -2);  /* get property */
     lua_remove(L, -2);    /* remove previous object */
@@ -127,16 +129,25 @@
 int hsluaO_get_numerical(lua_State *L)
 {
   hsluaO_get_caching_table(L, 1);
-  int requested = lua_tointeger(L, 2);
+  lua_Integer requested = lua_tointeger(L, 2);
 
-  lua_getfield(L, 1, "__lazylistindex");
-  int last_index = lua_tointeger(L, -1);
-  lua_pop(L, 1);                        /* pop last-index value */
-
-  if (requested > last_index) {
-    /* index not in cache, force lazy evaluation of list items */
-    if (luaL_getmetafield(L, 1, "lazylisteval") == LUA_TFUNCTION &&
-        lua_getfield(L, 3, "__lazylist") == LUA_TUSERDATA) {
+  /* The __lazylistindex is set to `nil` or an integer if part of the
+     list is still unevaluated. If it's `false`, then all list values are
+     already in the cache. */
+  if (lua_getfield(L, 1, "__lazylistindex") == LUA_TBOOLEAN) {
+    lua_pop(L, 1);                      /* remove nil */
+  } else {
+    lua_Integer last_index = lua_tointeger(L, -1);
+    lua_pop(L, 1);                      /* pop last-index value */
+
+    if (requested > last_index &&
+        /* index not in cache, force lazy evaluation of list items */
+        luaL_getmetafield(L, 1, "lazylisteval") == LUA_TFUNCTION) {
+      if (lua_getfield(L, 3, "__lazylist") != LUA_TUSERDATA) {
+        /* lazy list thunk is missing; that shouldn't happen!!  */
+        luaL_error(L, "Error while getting numerical index %d: "
+                   "lazy list thunk is missing", requested);
+      }
       lua_pushinteger(L, last_index);
       lua_pushinteger(L, requested);
       lua_pushvalue(L, 3);              /* caching table */
@@ -168,12 +179,12 @@
   lua_settop(L, 2);
   /* do numeric lookup for integer keys */
   return lua_isinteger(L, 2)
-    ? hsluaO_get_numerical(L)
+    ? (hsluaO_get_via_alias(L) || hsluaO_get_numerical(L))
     /* try various sources in order; return 0 if nothing is found. */
-    : (hsluaO_get_from_cache(L)
-       || hsluaO_get_via_getter(L)
-       || hsluaO_get_via_alias(L)
-       || hsluaO_get_method(L));
+    : (hsluaO_get_from_cache(L) ||
+       hsluaO_get_via_getter(L) ||
+       hsluaO_get_via_alias(L)  ||
+       hsluaO_get_method(L));
 }
 
 /*
@@ -193,18 +204,55 @@
   lua_pushvalue(L, 1);    /* start with the original object */
   /* Iterate over properties; last object is on top of stack,
    * list of properties is the second object. */
-  for (int i = 1; i < lua_rawlen(L, -2); i++) {
+  lua_Integer len = (lua_Integer) lua_rawlen(L, -2);
+  for (int i = 1; i < len; i++) {
     lua_rawgeti(L, -2, i);
     lua_gettable(L, -2);  /* get property */
     lua_remove(L, -2);    /* remove previous object */
   }
-  lua_rawgeti(L, -2, lua_rawlen(L, -2)); /* last element */
-  lua_pushvalue(L, 3);    /* new value */
+  lua_rawgeti(L, -2, len); /* last element */
+  lua_pushvalue(L, 3);     /* new value */
   lua_settable(L, -3);
   return 1;
 }
 
 /*
+** Sets a numerical index on this object. The userdata must be in
+** position 1, the key in position 2, and the new value in position 3.
+** Returns 1 on success and 0 otherwise.
+*/
+int hsluaO_set_numerical(lua_State *L)
+{
+  hsluaO_get_caching_table(L, 1);
+  lua_Integer target = lua_tointeger(L, 2);
+
+  /* The `__lazylistindex` field is set to `false` if each list element
+     has already been evaluated and stored in the cache. Otherwise it
+     will be either `nil` or an integer. */
+  if (lua_getfield(L, 1, "__lazylistindex") == LUA_TBOOLEAN) {
+    lua_pop(L, 1);                      /* pop boolean from last-index */
+  } else {
+    /* list is not fully evaluated yet, we may have to evaluate it
+       further. */
+    lua_Integer last_index = lua_tointeger(L, -1);
+    lua_pop(L, 1);                      /* pop last-index value */
+
+    if (target > last_index) {
+      /* the index we want to assign has not been cached yet. Evaluation
+       * is forced to avoid any uncertainty about the meaning of
+       * `nil`-valued indices. */
+      lua_pushcfunction(L, &hsluaO_get_numerical);
+      lua_pushvalue(L, 1);
+      lua_pushvalue(L, 2);
+      lua_call(L, 2, 0);
+    }
+  }
+  lua_pushvalue(L, 3);                  /* new value */
+  lua_rawseti(L, -2, target);           /* set in caching table */
+  return 1;
+}
+
+/*
 ** Set value via a property alias. Assumes the stack to be in a state as
 ** after __newindex is called. Returns 1 on success, 0 if the object is
 ** readonly, and throws an error if there is no setter for the given
@@ -239,6 +287,9 @@
 int hslua_udnewindex(lua_State *L)
 {
   if (lua_type(L, 2) == LUA_TNUMBER) {
+    if (hsluaO_set_via_alias(L) || hsluaO_set_numerical(L)) {
+      return 0;
+    }
     lua_pushliteral(L, "Cannot set a numerical value.");
     return lua_error(L);
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-objectorientation-2.0.1/hslua-objectorientation.cabal 
new/hslua-objectorientation-2.1.0/hslua-objectorientation.cabal
--- old/hslua-objectorientation-2.0.1/hslua-objectorientation.cabal     
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/hslua-objectorientation.cabal     
2001-09-09 03:46:40.000000000 +0200
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                hslua-objectorientation
-version:             2.0.1
+version:             2.1.0
 synopsis:            Object orientation tools for HsLua
 description:         Expose Haskell objects to Lua with an object oriented
                      interface.
@@ -10,7 +10,7 @@
 license-file:        LICENSE
 author:              Albert Krewinkel
 maintainer:          [email protected]
-copyright:           ?? 2021 Albert Krewinkel
+copyright:           ?? 2021-2022 Albert Krewinkel
 category:            Foreign
 build-type:          Simple
 extra-source-files:  README.md
@@ -20,8 +20,9 @@
                    , GHC == 8.4.4
                    , GHC == 8.6.5
                    , GHC == 8.8.4
-                   , GHC == 8.10.4
+                   , GHC == 8.10.7
                    , GHC == 9.0.1
+                   , GHC == 9.2.1
 
 source-repository head
   type:                git
@@ -34,10 +35,10 @@
                      , bytestring        >= 0.10.2 && < 0.12
                      , containers        >= 0.5.9  && < 0.7
                      , exceptions        >= 0.8    && < 0.11
-                     , hslua-core        >= 2.0    && < 2.1
-                     , hslua-marshalling >= 2.0.1  && < 2.1
+                     , hslua-core        >= 2.1    && < 2.2
+                     , hslua-marshalling >= 2.1    && < 2.2
                      , mtl               >= 2.2    && < 2.3
-                     , text              >= 1.0    && < 1.3
+                     , text              >= 1.2    && < 2.1
   ghc-options:         -Wall
                        -Wincomplete-record-updates
                        -Wnoncanonical-monad-instances
@@ -59,6 +60,7 @@
                      , HsLua.ObjectOrientation.Operation
   hs-source-dirs:      src
   default-extensions:  LambdaCase
+                     , StrictData
   other-extensions:    AllowAmbiguousTypes
                      , CPP
                      , FlexibleInstances
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-objectorientation-2.0.1/src/HsLua/ObjectOrientation/Operation.hs 
new/hslua-objectorientation-2.1.0/src/HsLua/ObjectOrientation/Operation.hs
--- old/hslua-objectorientation-2.0.1/src/HsLua/ObjectOrientation/Operation.hs  
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/src/HsLua/ObjectOrientation/Operation.hs  
2001-09-09 03:46:40.000000000 +0200
@@ -1,7 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-|
 Module      : HsLua.ObjectOrientation.Operation
-Copyright   : ?? 2020-2021 Albert Krewinkel
+Copyright   : ?? 2020-2022 Albert Krewinkel
 License     : MIT
 Maintainer  : Albert Krewinkel <[email protected]>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-objectorientation-2.0.1/src/HsLua/ObjectOrientation.hs 
new/hslua-objectorientation-2.1.0/src/HsLua/ObjectOrientation.hs
--- old/hslua-objectorientation-2.0.1/src/HsLua/ObjectOrientation.hs    
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/src/HsLua/ObjectOrientation.hs    
2001-09-09 03:46:40.000000000 +0200
@@ -5,7 +5,7 @@
 {-# LANGUAGE TypeApplications    #-}
 {-|
 Module      : HsLua.ObjectOrientation
-Copyright   : ?? 2021 Albert Krewinkel
+Copyright   : ?? 2021-2022 Albert Krewinkel
 License     : MIT
 Maintainer  : Albert Krewinkel <[email protected]>
 
@@ -34,6 +34,7 @@
   , Operation (..)
   , ListSpec
   , Possible (..)
+  , Alias
   , AliasIndex (..)
   ) where
 
@@ -58,18 +59,33 @@
 -- Haskell values. The type name must be unique; once the type has been
 -- used to push or retrieve a value, the behavior can no longer be
 -- modified through this type.
+--
+-- This type includes methods to define how the object should behave as
+-- a read-only list of type @itemtype@.
 data UDTypeWithList e fn a itemtype = UDTypeWithList
   { udName          :: Name
   , udOperations    :: [(Operation, fn)]
   , udProperties    :: Map Name (Property e a)
   , udMethods       :: Map Name fn
-  , udAliases       :: Map Name Alias
+  , udAliases       :: Map AliasIndex Alias
   , udListSpec      :: Maybe (ListSpec e a itemtype)
   , udFnPusher      :: fn -> LuaE e ()
   }
 
-type ListSpec e a itemtype = (a -> [itemtype], Pusher e itemtype)
+-- | Pair of pairs, describing how a type can be used as a Lua list. The
+-- first pair describes how to push the list items, and how the list is
+-- extracted from the type; the second pair contains a method to
+-- retrieve list items, and defines how the list is used to create an
+-- updated value.
+type ListSpec e a itemtype =
+  ( (Pusher e itemtype, a -> [itemtype])
+  , (Peeker e itemtype, a -> [itemtype] -> a)
+  )
 
+-- | A userdata type, capturing the behavior of Lua objects that wrap
+-- Haskell values. The type name must be unique; once the type has been
+-- used to push or retrieve a value, the behavior can no longer be
+-- modified through this type.
 type UDType e fn a = UDTypeWithList e fn a Void
 
 -- | Defines a new type, defining the behavior of objects in Lua.
@@ -125,6 +141,7 @@
 data AliasIndex
   = StringIndex Name
   | IntegerIndex Lua.Integer
+  deriving (Eq, Ord)
 
 instance IsString AliasIndex where
   fromString = StringIndex . fromString
@@ -133,7 +150,7 @@
 data Member e fn a
   = MemberProperty Name (Property e a)
   | MemberMethod Name fn
-  | MemberAlias Name Alias
+  | MemberAlias AliasIndex Alias
 
 -- | Use a documented function as an object method.
 methodGeneric :: Name -> fn -> Member e fn a
@@ -197,9 +214,9 @@
   }
 
 -- | Define an alias for another, possibly nested, property.
-alias :: Name  -- ^ property alias
-      -> Text  -- ^ description
-      -> [AliasIndex] -- ^ sequence of nested properties
+alias :: AliasIndex    -- ^ property alias
+      -> Text          -- ^ description
+      -> [AliasIndex]  -- ^ sequence of nested properties
       -> Member e fn a
 alias name _desc = MemberAlias name
 
@@ -221,7 +238,7 @@
     add "aliases" $ pushAliases ty
     case udListSpec ty of
       Nothing -> pure ()
-      Just (_, pushItem) -> do
+      Just ((pushItem, _), _) -> do
         add "lazylisteval" $ pushHaskellFunction (lazylisteval pushItem)
   where
     add :: LuaError e => Name -> LuaE e () -> LuaE e ()
@@ -294,7 +311,7 @@
 pushAliases ty = do
   newtable
   void $ flip Map.traverseWithKey (udAliases ty) $ \name propSeq -> do
-    pushName name
+    pushAliasIndex name
     pushList pushAliasIndex propSeq
     rawset (nth 3)
 
@@ -330,7 +347,7 @@
 --
 -- 1. userdata wrapping the unevalled part of the lazy list
 -- 2. index of the last evaluated element
--- 3. index of the last requested element
+-- 3. index of the requested element
 -- 4. the caching table
 lazylisteval :: forall itemtype e. LuaError e
              => Pusher e itemtype -> LuaE e NumResults
@@ -342,16 +359,22 @@
     (Just unevaled, Just curindex, Just newindex) -> do
       let numElems = fromIntegral $ max (newindex - curindex) 0
           (as, rest) = splitAt numElems unevaled
-      -- put back remaining unevalled list
-      _ <- putuserdata @[itemtype] (nthBottom 1) lazyListStateName rest
+      if null rest
+        then do
+          -- no more elements in list; unset variable
+          pushName "__lazylistindex"
+          pushBool False
+          rawset (nthBottom 4)
+        else do
+          -- put back remaining unevalled list
+          void $ putuserdata @[itemtype] (nthBottom 1) lazyListStateName rest
+          pushName "__lazylistindex"
+          pushinteger (curindex + fromIntegral (length as))
+          rawset (nthBottom 4)
       -- push evaluated elements
-      settop 4  -- ensure caching table is at the top of the stack
       forM_ (zip [(curindex + 1)..] as) $ \(i, a) -> do
         pushItem a
         rawseti (nthBottom 4) i
-      pushName "__lazylistindex"
-      pushinteger (curindex + fromIntegral (length as))
-      rawset (nthBottom 4)
       return (NumResults 0)
     _ -> pure (NumResults 0)
 
@@ -368,7 +391,7 @@
   -- add list as value in caching table
   case udListSpec ty of
     Nothing -> pure ()
-    Just (toList, _) -> do
+    Just ((_, toList), _) -> do
       newtable
       pushName "__lazylist"
       newhsuserdata (toList x)
@@ -382,16 +405,17 @@
 peekUD ty idx = do
   let name = udName ty
   x <- reportValueOnFailure name (`fromuserdata` name) idx
-  liftLua $ do
-    result <- getuservalue idx >>= \case
-      TypeTable -> do
+  (`lastly` pop 1) $ liftLua (getuservalue idx) >>= \case
+    TypeTable -> do
+      -- set list
+      xWithList <- maybe pure setList (udListSpec ty) x
+      liftLua $ do
         pushnil
-        setProperties (udProperties ty) x
-      _ -> do
-        return x
-    pop 1          -- uservalue (caching) table
-    return result
+        setProperties (udProperties ty) xWithList
+    _ -> return x
 
+-- | Retrieves object properties from a uservalue table and sets them on
+-- the given value. Expects the uservalue table at the top of the stack.
 setProperties :: LuaError e => Map Name (Property e a) -> a -> LuaE e a
 setProperties props x = do
   hasNext <- Unsafe.next (nth 2)
@@ -407,3 +431,37 @@
             pop 1
             setProperties props x'
       _ -> x <$ pop 1
+
+-- | Gets a list from a uservalue table and sets it on the given value.
+-- Expects the uservalue (i.e., caching) table to be at the top of the
+-- stack.
+setList :: forall itemtype e a. LuaError e
+        => ListSpec e a itemtype -> a
+        -> Peek e a
+setList (_pushspec, (peekItem, updateList)) x = (x `updateList`) <$!> do
+  liftLua (getfield top "__lazylistindex") >>= \case
+    TypeBoolean -> do
+      -- list had been fully evaluated
+      liftLua $ pop 1
+      peekList peekItem top
+    _ -> do
+      let getLazyList = do
+            liftLua (getfield top "__lazylist") >>= \case
+              TypeUserdata -> pure ()
+              _ -> failPeek "unevaled items of lazy list cannot be peeked"
+            (`lastly` pop 1) $ reportValueOnFailure
+              lazyListStateName
+              (\idx -> fromuserdata @[itemtype] idx lazyListStateName)
+              top
+      mlastIndex <- liftLua (tointeger top <* pop 1)
+      let itemsAfter = case mlastIndex of
+            Nothing -> const getLazyList
+            Just lastIndex -> \i ->
+              if i <= lastIndex
+              then liftLua (rawgeti top i) >>= \case
+                TypeNil -> [] <$ liftLua (pop 1)
+                _ -> do
+                  y <- peekItem top `lastly` pop 1
+                  (y:) <$!> itemsAfter (i + 1)
+              else getLazyList
+      itemsAfter 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-objectorientation-2.0.1/test/HsLua/ObjectOrientationTests.hs 
new/hslua-objectorientation-2.1.0/test/HsLua/ObjectOrientationTests.hs
--- old/hslua-objectorientation-2.0.1/test/HsLua/ObjectOrientationTests.hs      
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/test/HsLua/ObjectOrientationTests.hs      
2001-09-09 03:46:40.000000000 +0200
@@ -5,7 +5,7 @@
 Module      : HsLua.ObjectOrientationTests
 Copyright   : ?? 2007???2012 Gracjan Polak;
               ?? 2012???2016 ??mer Sinan A??acan;
-              ?? 2017-2021 Albert Krewinkel
+              ?? 2017-2022 Albert Krewinkel
 License     : MIT
 Maintainer  : Albert Krewinkel <[email protected]>
 Stability   : beta
@@ -193,14 +193,71 @@
         _ <- dostring "return list[0], list[5]"
         (,) <$> ltype (nth 1) <*> ltype (nth 2)
 
-    , "List is read-only" =:
-      (ErrRun, "Cannot set a numerical value.") `shouldBeResultOf` do
+    , "Last evaled index is available in __lazylistindex" =:
+      3 `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [9..17]
+        setglobal "quuz"
+        _ <- dostring "local foo = quuz[3]; return quuz.__lazylistindex"
+        forcePeek $ peekIntegral @Int top
+
+    , "__lazylistindex becomes `false` when all items are evaled" =:
+      False `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [1..3]
+        setglobal "quuz"
+        _ <- dostring "local foo = quuz[3]; return quuz.__lazylistindex"
+        forcePeek $ peekBool top
+
+    , "Input can be retrieved unchanged" =:
+      LazyIntList [9..17] `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [9..17]
+        setglobal "ninetofive"
+        _ <- dostring "assert(ninetofive[3] == 11); return ninetofive"
+        forcePeek $ peekUD typeLazyIntList top
+
+    , "List is writable" =:
+      LazyIntList [1, 4, 9, 16] `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [0,4,9,16]
+        setglobal "list"
+        OK <- dostring "list[1] = 1; return list"
+        forcePeek $ peekUD typeLazyIntList top
+
+    , "List can be extended" =:
+      LazyIntList [1, 4, 9, 16, 25] `shouldBeResultOf` do
         openlibs
         pushUD typeLazyIntList $ LazyIntList [1,4,9,16]
         setglobal "list"
-        statusCode <- dostring "list[1] = 2"
-        err <- forcePeek $ peekString top
-        pure (statusCode, err)
+        OK <- dostring "list[5] = 25; return list"
+        forcePeek $ peekUD typeLazyIntList top
+
+    , "List can be shortened" =:
+      LazyIntList [1, 9, 27, 81] `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [1, 9, 27, 81, 243]
+        setglobal "list"
+        OK <- dostring "list[5] = nil; return list"
+        forcePeek $ peekUD typeLazyIntList top
+
+    , "Setting element to nil shortenes the list" =:
+      LazyIntList [1, 9, 27] `shouldBeResultOf` do
+        openlibs
+        pushUD typeLazyIntList $ LazyIntList [1, 9, 27, 81, 243]
+        setglobal "list"
+        OK <- dostring "list[4] = nil; return list"
+        forcePeek $ peekUD typeLazyIntList top
+
+    , "Infinite lists are ok" =:
+      233 `shouldBeResultOf` do
+        openlibs
+        let fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
+        pushUD typeLazyIntList $ LazyIntList fibs
+        setglobal "fibs"
+        dostring "return fibs[14]" >>= \case
+          OK -> forcePeek $ peekIntegral @Int top
+          _ -> failLua =<< forcePeek (peekString top)
     ]
 
   , testGroup "possible properties"
@@ -253,6 +310,27 @@
           -- msg <- forcePeek $ peekString top
           -- liftIO $ putStrLn msg
           forcePeek $ peekPoint top
+      , "read subelement via integer alias" =:
+        13.37 `shouldBeResultOf` do
+          openlibs
+          pushUD typeQux $ Quuz (Point 13.37 0) undefined
+          setglobal "quuz"
+          _ <- dostring "return quuz[1]"
+          forcePeek $ peekRealFloat @Double top
+      , "set subelement via integer alias" =:
+        Point 42 1 `shouldBeResultOf` do
+          openlibs
+          pushUD typeQux $ Quuz (Point 1 1) undefined
+          setglobal "quuz"
+          _ <- dostring "quuz[1] = 42; return quuz.point"
+          forcePeek $ peekPoint top
+      , "non-aliased integer fields are nil" =:
+        TypeNil `shouldBeResultOf` do
+          openlibs
+          pushUD typeQux (Quuz undefined undefined)
+          setglobal "quuz"
+          _ <- dostring "return quuz[3]"
+          ltype top
       , "absent alias returns `nil`" =:
         TypeNil `shouldBeResultOf` do
           openlibs
@@ -261,6 +339,14 @@
           dostring "return quux.x" >>= \case
             OK -> ltype top
             _ -> failLua =<< forcePeek (peekString top)
+      , "alias can point to the element itself" =:
+        9 `shouldBeResultOf` do
+          openlibs
+          pushUD typeLazyIntList (LazyIntList [1, 1, 1, 3, 5, 9, 17, 31])
+          setglobal "tribonacci"
+          dostring "return tribonacci.seq[6]" >>= \case
+            OK -> forcePeek $ peekIntegral @Int top
+            _ -> failLua =<< forcePeek (peekString top)
       ]
     ]
   ]
@@ -327,8 +413,10 @@
       pushString (show lazyList)
       return (NumResults 1)
   ]
-  []
-  (Just (fromLazyIntList, pushIntegral))
+  [ alias "seq" "sequence" [] ]
+  (Just ( (pushIntegral, fromLazyIntList)
+        , (peekIntegral, \_ lst -> LazyIntList lst)
+        ))
 
 --
 -- Sample sum type
@@ -391,4 +479,5 @@
         Quux {}  -> const Absent)
 
   , alias "x" "The x coordinate of a point in Quuz" ["point", "x"]
+  , alias (IntegerIndex 1) "The x coordinate of a point in Quuz" ["point", "x"]
   ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-objectorientation-2.0.1/test/test-hslua-objectorientation.hs 
new/hslua-objectorientation-2.1.0/test/test-hslua-objectorientation.hs
--- old/hslua-objectorientation-2.0.1/test/test-hslua-objectorientation.hs      
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-objectorientation-2.1.0/test/test-hslua-objectorientation.hs      
2001-09-09 03:46:40.000000000 +0200
@@ -2,7 +2,7 @@
 Module      : Main
 Copyright   : ?? 2007???2012 Gracjan Polak;
               ?? 2012???2016 ??mer Sinan A??acan;
-              ?? 2017-2021 Albert Krewinkel
+              ?? 2017-2022 Albert Krewinkel
 License     : MIT
 Maintainer  : Albert Krewinkel <[email protected]>
 Stability   : beta

Reply via email to