Code archives/Miscellaneous/Map, Filter, Reduce functions for TLists
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| When dealing with lists, there are a few functions that become incredibly useful when you get used to using them. They are the map, reduce and filter operations. Map applies a given function to every object in the list, for example making text strings all-caps. Filter returns only the elements of the list that make a given function return True, for example only the strings which end in ".bmx" Reduce returns a single value constructed by calling a given function on the first two elements in the list, then on the result of that and the third element, and so on. You might use this to find the longest string in a list, for example. | |||||
'you can very easily rewrite these functions as methods in the TList definition in brl.mod/linkedlist.mod/linkedlist.bmx
'just take out the il:TList parameter and change '=Eachin il' to '=EachIn Self'
Function Filter:TList( il:TList, func(o:Object), inplace=0 )
Local l:TList
If inplace
l=il
Else
l=New TList
EndIf
Local o:Object
For o:Object=EachIn il
If inplace
If Not func(o) il.remove(o)
Else
If func(o) l.addlast o
EndIf
Next
Return l
End Function
Function Map:TList( il:TList, func:Object(o:Object), inplace=0 )
Local l:TList
If inplace
l=il
Else
l=New TList
EndIf
Local o:Object
For o:Object=EachIn il
If inplace
il.remove o
il.addlast func(o)
Else
l.addlast func(o)
EndIf
Next
Return l
End Function
Function Reduce:Object( il:TList, func:Object( o1:Object, o2:Object ) )
Local oo:Object, o:Object
For o:Object=EachIn il
If oo
o=func(oo,o)
EndIf
oo=o
Next
Return oo
End Function
'An example for each of the functions
Function startswitha( o:Object )
s$=String(o)
If Not s Return 0
If Lower(Chr(s[0]))="a" Return 1
End Function
Function prettify:Object( o:Object )
s$=String(o)
s=Upper(s[..1])+s[1..]
Select s[Len(s)-1..]
Case ",",".","?","!"
Default
s:+"."
End Select
Return s
End Function
Function longest:Object(o1:Object,o2:Object)
If Len(String(o1))>Len(String(o2))
Return o1
Else
Return o2
EndIf
End Function
'make a list of test inputs
l:TList=New TList
txt$="aardvark bee armadillo Armature zygote twist! boogie. alack"
Print "input list~n-----------"
For word$=EachIn txt.split(" ")
l.addlast word
Print word
Next
'filter out words that don't start with the letter A
Print "~nfilter: starts with a~n-----------"
For word$=EachIn filter(l, startswitha)
Print word
Next
'make each word look nice
Print "~nmap: prettify~n-----------"
For word$=EachIn map(l, prettify)
Print word
Next
'join all the words together with hyphens
Print "~nreduce: longest~n-----------"
Print String( reduce(l, longest) )
dir=ReadDir("./")
files:TList=New TList
t$=NextFile(dir)
While t
files.addlast t
t=NextFile(dir)
Wend
'for a grand finale, an incredibly clever usage
'this function takes a suffix, and returns a function which tells you if the given string ends in the suffix or not
Function endsin(o:Object)(suffix$)
Global a$=suffix
Function f(o:Object)
s$=String(o)
If s[Len(s)-4..]=a Return 1 Else Return 0
End Function
Return f
End Function
'this function adds the current path to the given string
Function addpath:Object(o:Object)
s$=String(o)
Return CurrentDir()+s
End Function
Print "~n~nAll .bmx files in this directory~n-----------"
For t$=EachIn Map(Filter(files,endsin(".bmx")),addpath)
Print t
Next |
Comments
None.
Code Archives Forum