I use Python and Autoit about half the time and always wished that AutoIt had an associative array like the dictionary data type. I've found some examples but many were functional based and seemed disconnected to me. I have been using the AutoItObject.au3 by monoceres, trancexx, Kip, and Prog@ndy (big shoutout there, this thing is amazing) and tried to take a stab at wrapping up a dictionary in an object.
Would love any feedback or ideas to make it better, it is pretty rough at this point and could use more work but the idea is there.
#include "AutoitObject.au3"
#include "Array.au3"
Local $my_dict = Dict( _
'dog', ' woof ' _
,'cat', ' meow' _
,'owl', ' hoot ' _
)
msgbox(0, '', $my_dict.to_string())
$my_dict.map(StringStripWS, 3)
msgbox(0, '', $my_dict.to_string())
$my_dict.map(StringReplace, 'meow', 'purr')
msgbox(0, '', $my_dict.to_string())
; #FUNCTION# ====================================================================================================================
; Name ..........: Dict
; Description ...: Creates a wrapper object for a dictionary
; Parameters ....: $kX-$vX - Key-Value pairs
; Return values .: Success - Object containing a dictionary
; Failure - Null
; @extended - N/A
; ===============================================================================================================================
Func Dict( _
$k1=Default, $v1=Default _
,$k2=Default, $v2=Default _
,$k3=Default, $v3=Default _
,$k4=Default, $v4=Default _
,$k5=Default, $v5=Default _
,$k6=Default, $v6=Default _
,$k7=Default, $v7=Default _
,$k8=Default, $v8=Default _
,$k9=Default, $v9=Default _
,$k10=Default, $v10=Default _
,$k11=Default, $v11=Default _
,$k12=Default, $v12=Default _
)
; Initialize AutoItObject
_AutoItObject_StartUp()
Local $oClassObject = _AutoItObject_Class()
$oClassObject.Create()
; -- Create Length Prop -- ;
Local $Props = ['len']
; -- Create our Dictionary -- ;
Local $oDict = ObjCreate('Scripting.Dictionary')
; -- Add any init key-value pairs -- ;
Local $iLen = 0
If $k1 Then
$iLen += 1
$oDict.add($k1,$v1)
EndIf
If $k2 Then
$iLen += 1
$oDict.add($k2,$v2)
EndIf
If $k3 Then
$iLen += 1
$oDict.add($k3,$v3)
EndIf
If $k4 Then
$iLen += 1
$oDict.add($k4,$v4)
EndIf
If $k5 Then
$iLen += 1
$oDict.add($k5,$v5)
EndIf
If $k6 Then
$iLen += 1
$oDict.add($k6,$v6)
EndIf
If $k7 Then
$iLen += 1
$oDict.add($k7,$v7)
EndIf
If $k8 Then
$iLen += 1
$oDict.add($k8,$v8)
EndIf
If $k9 Then
$iLen += 1
$oDict.add($k9,$v9)
EndIf
If $k10 Then
$iLen += 1
$oDict.add($k10,$v10)
EndIf
If $k11 Then
$iLen += 1
$oDict.add($k11,$v11)
EndIf
If $k12 Then
$iLen += 1
$oDict.add($k12,$v12)
EndIf
; -- Add the length and dictionary to be accessed via methods -- ;
$oClassObject.AddProperty('len', $ELSCOPE_PUBLIC, $iLen) ; Create Length Property binded to object
$oClassObject.AddProperty('dict', $ELSCOPE_PUBLIC, $oDict) ; Create actual Dictionary as property to access in methods
; -- All methods (all rely on the dictionary prop) -- ;
$oClassObject.AddMethod("get", "get")
$oClassObject.AddMethod("set", "set")
$oClassObject.AddMethod("keys", "keys")
$oClassObject.AddMethod("values", "values")
$oClassObject.AddMethod("exists", "exists")
$oClassObject.AddMethod("to_string", "to_string")
$oClassObject.AddMethod("clear", "clear")
$oClassObject.AddMethod("remove", "remove")
$oClassObject.AddMethod("map", "map")
; -- Add destructor -- ;
$oClassObject.AddDestructor("Dict_Destructor")
Return $oClassObject.Object
EndFunc
; -- Destorys the Dict upon deletion of object -- ;
Func Dict_Destructor($oSelf)
ConsoleWrite("Destorying Dict")
$oSelf.dict.RemoveAll
EndFunc
; -- Sets the value for a given key -- ;
Func set($oSelf, $sKey, $sValue)
If $oSelf.dict.Exists($sKey) Then
$oSelf.remove($sKey)
$oSelf.dict.add($sKey, $sValue)
Else
$oSelf.len += 1
$oSelf.dict.add($sKey, $sValue)
EndIf
EndFunc
; -- Gets the value for a key -- ;
Func get($oSelf, $sKey)
If $oSelf.dict.Exists($sKey) Then
Return $oSelf.dict.Item($sKey)
Else
Return "KEY_ERR"
EndIf
EndFunc
; -- Removes the Key-Value pair by key -- ;
Func remove($oSelf, $sKey)
If $oSelf.dict.Exists($sKey) Then
$oSelf.dict.Remove($sKey)
Return
Else
Return "KEY_ERR"
EndIf
EndFunc
; -- Returns an array of keys -- ;
Func keys($oSelf)
Local $aKeys[0]
For $item in $oSelf.dict.Keys
_ArrayAdd($aKeys, $item)
Next
Return $aKeys
EndFunc
; -- Returns the Array of Values -- ;
Func values($oSelf)
Local $aVals[0]
For $item in $oSelf.dict.Items
_ArrayAdd($aVals, $item)
Next
Return $aVals
EndFunc
; -- Returns Bool if keys exists or not -- ;
Func exists($oSelf, $sKey)
If $oSelf.dict.Exists($sKey) Then
Return True
EndIf
Return False
EndFunc
; -- Returns a json notation string -- ;
Func to_string($oSelf)
Local $aKeys = $oSelf.keys
Local $aVals = $oSelf.values
Local $str = "{"&@CRLF
For $i=0 to UBound($oSelf.keys)-1
$str &= @TAB &'"'& $aKeys[$i] &'"'& ', "'& $aVals[$i] &'"'&@CRLF
Next
$str &= "}"
Return $str
EndFunc
; -- Clears the entire dict -- ;
Func clear($oSelf)
$oSelf.len = 0
$oSelf.dict.RemoveAll()
EndFunc
; -- Maps given function to the values -- ;
Func map($oSelf, $oFunc, $param1=Default, $param2=Default)
If $param2 and $param1 Then
For $key in $oSelf.keys
$oSelf.set($key, $oFunc($oSelf.get($key), $param1, $param2))
Next
ElseIf $param1 Then
For $key in $oSelf.keys
$oSelf.set($key, $oFunc($oSelf.get($key), $param1))
Next
EndIf
EndFunc