slist: Sized list

[ data-structures, library, list, mpl ] [ Propose Tags ]

This package implements Slist data structure that stores the size of the list along with the list itself.


[Skip to Readme]
Versions [faq] 0.0.0
Change log CHANGELOG.md
Dependencies base (>=4.10.1.0 && <4.13) [details]
License MPL-2.0
Copyright 2019 Veronika Romashkina
Author Veronika Romashkina
Maintainer vrom911@gmail.com
Category Data Structures, List
Home page https://github.com/vrom911/slist
Bug tracker https://github.com/vrom911/slist/issues
Source repo head: git clone https://github.com/vrom911/slist.git
Uploaded by vrom911 at Sun Mar 31 14:52:59 UTC 2019
Distributions NixOS:0.0.0
Downloads 33 total (11 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2019-03-31 [all 1 reports]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for slist-0.0.0

[back to package description]

slist

Hackage MPL-2.0 license Build status

This package introduces sized list data type — Slist. The data type has the following shape:

data Slist a = Slist
    { sList :: [a]
    , sSize :: Size
    }

As you can see along with the familiar list, it contains Size field that represents the size of the structure. Slists can be finite or infinite, and this is expressed with Size.

data Size
    = Size Int
    | Infinity

This representation of the list gives some additional advantages. Getting the length of the list is the "free" operation (runs in O(1)). This property helps to improve the performance for a bunch of functions like take, drop, at, etc. But also it doesn't actually add any overhead on the existing functions.

Also, this allows to write a number of safe functions like safeReverse, safeHead, safeLast, safeIsSuffixOf, etc.

Comparison

Check out the comparison table between lists and slists performance.

| Function | list (finite) | list (infinite) | Slist (finite) | Slist (infinite) | |-------------------|-----------------------------------|-----------------------------|----------------------------------------|------------------| | length | O(n) | <hangs> | O(1) | O(1) | | safeLast | O(n) | <hangs> | O(n) | O(1) | | init | O(n) | <hangs> | O(n) | O(1) | | take | O(min i n) | O(i) | 0 < i < n: O(i); otherwise: O(1) | O(i) | | at | O(min i n) (run-time exception) | O(i) (run-time exception) | 0 < i < n: O(i); otherwise: O(1) | O(i) | | safeStripPrefix | O(m) | O(m) (can hang) | O(m) | O(m) |

Potential usage cases

  • When you ask the length of the list too frequently.
  • When you need to convert to data structures that require to know the list size in advance for allocating an array of the elements. Example: Vector data structure.
  • When you need to serialised lists.
  • When you need to control the behaviour depending on the finiteness of the list.
  • When you need a more efficient or safe implementation of some functions.