summaryrefslogtreecommitdiff
path: root/modules/language/python/module/collections/abc.scm
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-02-23 13:12:17 +0100
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-02-23 13:12:17 +0100
commit408076be6aed70bc21dd01065dad9d99f05d3a27 (patch)
tree0d351f2905019f817b3c1c7ace168f0eb9f28734 /modules/language/python/module/collections/abc.scm
parentffaeb154569ad1e67856c65261a6b3563245eea9 (diff)
operator.scm
Diffstat (limited to 'modules/language/python/module/collections/abc.scm')
-rw-r--r--modules/language/python/module/collections/abc.scm334
1 files changed, 334 insertions, 0 deletions
diff --git a/modules/language/python/module/collections/abc.scm b/modules/language/python/module/collections/abc.scm
new file mode 100644
index 0000000..c056834
--- /dev/null
+++ b/modules/language/python/module/collections/abc.scm
@@ -0,0 +1,334 @@
+(define-module (language python module collections abc)
+ #:use-module (oop pf-objects)
+ #:export (Container Hashable Iterable Iterator Reversable Generator
+ Sized Callable Collection Sequence MutableSequence
+ ByteString Set MutableSet Mapping MutableMapping
+ MappingView ItemsView KeysView ValuesView))
+
+(define-python-class Container ()
+ (define __containes__
+ (lambda x (error "not implemented"))))
+
+(define-python.class Hashable ()
+ (define __hash__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Iterable ()
+ (define __iter__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Iterator (Iterable)
+ ;; Mixin
+ (define __iter__
+ (lambda (self) self))
+
+ ;; Abstract
+ (define __next__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Reversable (Iterable)
+ (define __reversed__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Generator (Iterator)
+ ;; Mixin
+ (define __next__
+ (lambda (self) ((ref self 'send))))
+
+ (define close
+ (lambda (self)
+ ((ref self 'throw) GeneratorExit)))
+
+ ;; Abstract
+ (define send
+ (lambda x (error "not implemented")))
+ (define throw
+ (lambda x (error "not implemented"))))
+
+(define-python-class Sized ()
+ (define __len__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Callable ()
+ (define __call__
+ (lambda x (error "not implemented"))))
+
+(define-python-class Collection (Sized Iterable Container))
+
+(define-python-class Sequence (Reversable Collection)
+ ;; Mixin
+ (define __contains__
+ (lambda (self x)
+ (let ((f (ref self '__getitem)))
+ (for ((i : (range (len self))))
+ (if (equal? x (f i))
+ (break #t))
+ #:final #f))))
+
+ (define __iter__
+ (lambda (self)
+ ((mk-iterator
+ (lambda (yield)
+ (let ((f (ref self '__getitem)))
+ (for ((i : (range (len self))))
+ (yield (f i)))))))))
+
+ (define __reversed__
+ (lambda (self)
+ ((mk-iterator
+ (lambda (yield)
+ (let ((f (ref self '__getitem)))
+ (for ((i : (range (len self) 0 -1)))
+ (yield (f i)))))))))
+
+ (define index
+ (lambda (self x)
+ (let ((f (ref self '__getitem__)))
+ (for ((i : (range (len self))))
+ (if (equal? x (f i))
+ (break y))
+ (raise IndexError)))))
+
+ (define count
+ (lambda (self x)
+ (let ((f (ref self '__getitem__)))
+ (for ((i : (range (len self)))) ((n 0))
+ (if (equal? x (f i))
+ (+ n 1)
+ n)
+ #:final n))))
+
+
+ ;; Abstract
+ (define __getitem__
+ (lambda x (error "not implemented"))))
+
+(define-python-class MutableSequence (Sequence)
+ ;; Mixin
+ (define append
+ (lambda (self x)
+ ((ref self 'insert) (len self) x)))
+
+ (define extend
+ (lambda (self it)
+ (let ((f (ref self 'insert)))
+ (for ((x : it)) ((i (len self)))
+ (f i x)
+ (+ i 1)))
+ (values)))
+
+ (define pop
+ (lambda (self)
+ (let* ((i (- (len self) 1))
+ (x ((ref self '__getitem__) i)))
+ ((ref self '__delitem__) i)
+ x)))
+
+ (define remove
+ (lambda (self x)
+ (let ((f (ref self '__getitem__)))
+ (for ((i : (range (len self))))
+ (if (equal? x (f i))
+ (begin
+ ((ref self '__delitem__) i)
+ (break)))))
+ (values)))
+
+
+ (define __iadd__
+ (lambda (self seq)
+ (let ((f (ref self 'insert)))
+ (for ((x : seq)) ((i (len self)))
+ (f i x)
+ (+ i 1)))
+ (values)))
+
+
+ ;; Abstract
+ (define __setitem__
+ (lambda x (error "not implemented")))
+ (define __delitem__
+ (lambda x (error "not implemented")))
+ (define insert
+ (lambda x (error "not implemented"))))
+
+(define-python-class ByteString (Sequence))
+
+(define-python-class Set (Collection)
+ ;; Mixins
+ (define __le__
+ (lambda (self o)
+ (let ((f (ref o '__contains__)))
+ (for ((x : ((ref self '__iter__))))
+ (if (not (f x))
+ (break #f))))))
+
+ (define __lt__
+ (lambda (self o)
+ (if (equal? (len self) (len o))
+ #f
+ (let ((f (ref o '__contains__)))
+ (for ((x : ((ref self '__iter__))))
+ (if (not (f x))
+ (break #f)))))))
+
+ (define __eq__
+ (lambda (self o)
+ (if (not (equal? (len self) (len o)))
+ #f
+ (let ((f (ref o '__contains__)))
+ (for ((x : ((ref self '__iter__))))
+ (if (not (f x))
+ (break #f)))))))
+
+ (define __ne__
+ (lambda (self o) (not ((ref self '__eq__) o))))
+
+ (define __gt__
+ (lambda (self o)
+ (if (equal? (len self) (len o))
+ #f
+ (let ((f (ref self '__contains__)))
+ (for ((x : ((ref o '__iter__))))
+ (if (not (f x))
+ (break #f)))))))
+
+ (define __ge__
+ (lambda (self o)
+ (let ((f (ref self '__contains__)))
+ (for ((x : ((ref o '__iter__))))
+ (if (not (f x))
+ (break #f))))))
+
+ (define __and__
+ (lambda (self o)
+ (let ((f (ref o '__contains__))
+ (s (set))
+ (a (ref s 'add)))
+ (for ((x : ((ref self '__iter__)))) ()
+ (if (f x)
+ (a x)))
+ s)))
+
+ (define __or__
+ (lambda (self o)
+ (let ((s (set))
+ (a (ref s 'add)))
+ (for ((x : ((ref self '__iter__)))) ()
+ (a x))
+ (for ((x : ((ref o '__iter__)))) ()
+ (a x))
+ s)))
+
+ (define __sub__
+ (lambda (self o)
+ (let ((f (ref o '__contains__))
+ (s (set))
+ (a (ref s 'add)))
+ (for ((x : ((ref self '__iter__)))) ()
+ (if (not (f x))
+ (a x)))
+ s)))
+
+ (define __xor__
+ (lambda (self o)
+ (let ((fo (ref o '__contains__))
+ (fs (ref self '__contains__))
+ (s (set))
+ (a (ref s 'add)))
+ (for ((x : ((ref self '__iter__)))) ()
+ (if (not (fo x))
+ (a x)))
+ (for ((x : ((ref o '__iter__)))) ()
+ (if (not (fs x))
+ (a x)))
+ s)))
+
+ (define disjoint
+ (lambda (self o)
+ (let ((f (ref o '__contains__))
+ (s (set))
+ (a (ref s 'add)))
+ (for ((x : ((ref self '__iter__)))) ()
+ (if (f x)
+ (break #f))
+ #:final #t)))))
+
+(define-python-class MutableSet (Set)
+ ;; Abstract methods
+ (define add
+ (lambda x (error "not implemented")))
+ (define discard
+ (lambda x (error "not implemented")))
+
+ ;; Mixins
+ (define clear)
+ (define pop)
+ (define remove)
+ (define __ior__)
+ (define __iand__)
+ (define __ixor__)
+ (define __isub__))
+
+(define-python-class Mapping (Collection)
+ ;; Mixins
+ (define __contains__)
+ (define keys)
+ (define items)
+ (define values)
+ (define get)
+ (define __eq__)
+ (define __ne__))
+
+(define-python-class MutableMapping (Mapping)
+ ;; Abstracts
+ (define __setitem__)
+ (define __delitem__)
+
+ ;; Mixins
+ (define pop)
+ (define popitem)
+ (define clear)
+ (define update)
+ (define setdefault))
+
+(define-python-class MappingView (Sized)
+ ;; Mixins
+ (define __init__
+ (lambda (self m)
+ (set self '_mapping m)))
+
+ (define __len__
+ (lambda (self) (len (ref self '_mapping)))))
+
+(define-python-class ItemsView (MappingView Set)
+ ;; Mixins
+ (define __contains__
+ (lambda (self x)))
+ (define __iter__
+ (lambda (self)
+ ((ref (ref self '_mapping) 'items)))))
+
+(define-python-class KeysView (MappingView Set)
+ ;; Mixins
+ (define __contains__
+ (lambda (self k)))
+
+ (define __iter__
+ (lambda (self)
+ ((ref (ref self '_mapping) 'keys)))))
+
+(define-python-class ValuesView (MappingView)
+ ;; Mixins
+ (define __contains__
+ (lambda (self x)))
+
+ (define __iter__
+ (lambda (self)
+ ((ref (ref self '_mapping) 'values)))))
+
+
+(name-object Container Hashable Iterable Iterator Reversable Generator
+ Sized Callable Collection Sequence MutableSequence
+ ByteString Set MutableSet Mapping MutableMapping
+ MappingView ItemsView KeysView ValuesView)