summaryrefslogtreecommitdiffstats
path: root/sca-cpp/branches/gcc-4.4/modules/wsgi/util.py
blob: d945c7bdef40720b71655abbb8941cb8a79b4082 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#    
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

# Simple utility functions

# Scheme-like lists
def cons(a, b):
    return (a,) + b

def car(l):
    return l[0]
    
def cdr(l):
    return l[1:]

def cadr(l):
    return car(cdr(l))

def cddr(l):
    return cdr(cdr(l))

def caddr(l):
    return car(cddr(l))

def reverse(l):
    r = list(l)
    r.reverse()
    return tuple(r)

def isNil(l):
    return l == ()

def isSymbol(v):
    return isinstance(v, basestring) and v[0:1] == "'"

def isList(v):
    if getattr(v, '__iter__', False) == False:
        return False
    if isinstance(v, basestring) or isinstance(v, dict):
        return False
    return True

def isTaggedList(v, t):
    return isList(v) and not isNil(v) and car(v) == t

# Scheme-like associations
def assoc(k, l):
    if l == ():
        return None

    if k == car(car(l)):
        return car(l)
    return assoc(k, cdr(l))

# Currying / partial function application
def curry(f, *args):
    return lambda *a: f(*(args + a))

# Split a path into a list of segments
def tokens(path):
    return tuple(filter(lambda s: len(s) != 0, path.split("/")))

# Write a list of strings to a stream
def writeStrings(l, os):
    if l == ():
        return os
    os.write(car(l))
    return writeStrings(cdr(l), os)