Skip to main content

Build Status

גamla is a functional programming library for python which is performant and supports async.

Installation

pip install gamla

Debugging anonymous compositions

gamla.compose(x, y, z) produces a new function which doesn't have a proper name. If x raises an exception, it is sometimes hard to figure out where this occurred. To overcome this, set the env variable GAMLA_DEBUG_MODE (to anything). This will cause the composition functions to give a name for the anonymous composition. The name would be a concatenation of its constituents' names, e.g. x_of_y_of_z. The name is given in a way that persists to the stack exceptions.

This is turned on only by flag because it incurs significant overhead so things might get slow.

Mixing asynchronous and synchronous code

Most functions in this lib will work seamlessly with async and regular functions, and allow the developer to focus on the logic instead of deciding where to place an await.

For example:

import asyncio

import gamla


def increment(i):
    return i + 1


async def increment_async(i):
    asyncio.sleep(1)
    return i + 1


async def run():
    mixed_composition = gamla.compose_left(increment, increment_async, increment)
    return await mixed_composition(0)  # returns 3!

Migrating from toolz

The main problems - toolz is slow and does not support async functions.

Why is it slow?

It uses the expensive inspect module to look at a function’s arguments, and doing so at each run. This happens not only on curried functions, but in compositions as well.

Why does gamla not suffer from this problem?

Two reasons:

  1. It does no longer support binary signatures on things like map, so it doesn’t need to infer anything (these are higher order functions in gamla).
  2. The gamla.curry function pays for the signature inspection in advance, and remembers its results.

Function mapping and common gotchas (written in blood):

  • curried.(filter|map|valmap|itemmap|keymap) -> gamla.$1 (make sure the call is with a single argument)
  • toolz.identity -> gamla.identity
  • toolz.contains -> `gamla.contains
  • toolz.lt -> gamla.greater_than
  • toolz.gt -> gamla.less_than
  • toolz.ge -> gamla.less_equals
  • toolz.le -> gamla.greater_equals
  • toolz.filter(None) -> gamla.filter(gamla.identity)
  • toolz.excepts(a, b, c) -> gamla.excepts(a, c, b)
  • toolz.excepts(a, b) -> gamla.excepts(a, gamla.just(None), b) (following the “data-last” currying convention)

Releasing a new version

  1. Create a pypi account.
  2. Download twine and give it your pypi credentials.
  3. Get pypi permissions for the project from its owner.
  4. python setup.py sdist bdist_wheel; twine upload dist/*; rm -rf dist;

Release files for gamla 39

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gamla 39
File Size Uploaded
gamla-39.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gamla 39
File Interpreter ABI Platform
gamla-39-py3-none-any.whl Python 3 none any Details

Total release size: 234.9 kB

Release files / gamla-39.tar.gz

Download URL gamla-39.tar.gz
Size 21.2 kB
Tags Source
SHA-256 checksum
How to use checksums
545c186b2cf0ad4a6576f446e182c7fbf1b8068562a02ddb06f5fb25826b662b
BLAKE2b-256 checksum
How to use checksums
87265cf3cbef86c952a27c80aa45149dc0b7e49df711dbe68d45968556248406
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.4.2 requests/2.23.0 setuptools/49.3.1 requests-toolbelt/0.8.0 tqdm/4.48.2 CPython/3.8.6

Release files / gamla-39-py3-none-any.whl

Download URL gamla-39-py3-none-any.whl
Size 213.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
088fdad01f15be5c4035ed5371049ddee39f956b3c44c0453b749287a179021f
BLAKE2b-256 checksum
How to use checksums
ff8413711eb0c2b5fb31c02883a58f603e052dd6cc244f44d06f1193b9fdefe4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.4.2 requests/2.23.0 setuptools/49.3.1 requests-toolbelt/0.8.0 tqdm/4.48.2 CPython/3.8.6

Release history Release notifications | RSS feed

164

1 release file

163

1 release file

162

1 release file

161

1 release file

160

1 release file

159

1 release file

158

1 release file

157

1 release file

156

1 release file

155

1 release file

154

1 release file

153

1 release file

152

1 release file

151

1 release file

150

1 release file

149

1 release file

148

1 release file

147

1 release file

146

1 release file

145

1 release file

144

1 release file

143

1 release file

142

1 release file

141

1 release file

140

1 release file

139

1 release file

138

1 release file

137

1 release file

136

1 release file

135

1 release file

134

1 release file

133

1 release file

132

1 release file

131

1 release file

130

1 release file

129

1 release file

128

1 release file

127

1 release file

126

1 release file

125

1 release file

124

1 release file

123

1 release file

122

1 release file

121

1 release file

120

1 release file

119

1 release file

118

1 release file

117

1 release file

116

1 release file

115

1 release file

114

1 release file

113

1 release file

112

1 release file

111

1 release file

110

1 release file

109

1 release file

108

1 release file

107

1 release file

106

1 release file

105

1 release file

104

1 release file

103

1 release file

102

1 release file

101

1 release file

100

1 release file

99

1 release file

98

1 release file

97

1 release file

96

1 release file

95

1 release file

94

1 release file

93

1 release file

92

1 release file

91

1 release file

90

1 release file

89

1 release file

88

1 release file

87

1 release file

86

1 release file

85

1 release file

84

1 release file

83

1 release file

82

1 release file

81

1 release file

80

1 release file

79

1 release file

78

1 release file

77

1 release file

76

1 release file

75

1 release file

74

1 release file

73

1 release file

72

2 release files

71

1 release file

70

1 release file

69

1 release file

68

2 release files

67

2 release files

66

2 release files

65

1 release file

64

1 release file

63

2 release files

62

2 release files

61

2 release files

60

2 release files

59

1 release file

58

2 release files

57

2 release files

56

2 release files

55

2 release files

54

1 release file

53

1 release file

52

1 release file

51

2 release files

50

2 release files

49

1 release file

48

2 release files

47

2 release files

46

1 release file

45

1 release file

44

2 release files

43

2 release files

42

2 release files

41

2 release files

40

2 release files

This release

39 This release

2 release files

38

2 release files

37

2 release files

36

2 release files

35

2 release files

34

2 release files

33

2 release files

32

2 release files

31

2 release files

30

2 release files

29

2 release files

28

2 release files

27

2 release files

26

2 release files

25

2 release files

24

2 release files

23

2 release files

22

2 release files

21

2 release files

20

2 release files

19

2 release files

18

2 release files

17

2 release files

16

2 release files

15

2 release files

14

2 release files

13

2 release files

12

2 release files

11

2 release files

10

2 release files

9

2 release files

8

2 release files

7

2 release files

6

2 release files

5

2 release files

4

2 release files

3

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1

2 release files

0.0.78

2 release files

0.0.77

2 release files

0.0.76

2 release files

0.0.75

2 release files

0.0.70

2 release files

0.0.69

2 release files

0.0.68

2 release files

0.0.67

2 release files

0.0.60

2 release files

0.0.59

2 release files

0.0.58

2 release files

0.0.57

2 release files

0.0.56

2 release files

0.0.55

2 release files

0.0.54

2 release files

0.0.53

1 release file

0.0.52

2 release files

0.0.51

2 release files

0.0.50

2 release files

0.0.49

2 release files

0.0.48

2 release files

0.0.47

2 release files

0.0.46

2 release files

0.0.45

2 release files

0.0.44

2 release files

0.0.43

2 release files

0.0.42

2 release files

0.0.39

2 release files

0.0.38

2 release files

0.0.37

2 release files

0.0.36

2 release files

0.0.35

2 release files

0.0.34

2 release files

0.0.33

2 release files

0.0.32

2 release files

0.0.31

2 release files

0.0.30

2 release files

0.0.29

2 release files

0.0.28

2 release files

0.0.27

2 release files

0.0.26

2 release files

0.0.25

2 release files

0.0.24

2 release files

0.0.23

2 release files

0.0.22

2 release files

0.0.21

2 release files

0.0.20

2 release files

0.0.19

2 release files

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page