MCPcopy Create free account
hub / github.com/dbProjectRED/redimo.go / listRotate

Method listRotate

lists.go:712–774  ·  view source on GitHub ↗
(key string)

Source from the content-addressed store, hash-verified

710}
711
712func (c Client) listRotate(key string) (element ReturnValue, err error) {
713 var actions []dynamodb.TransactWriteItem
714
715 rightEnd, ok, err := c.listFindEnd(key, Right)
716
717 if err != nil || !ok {
718 return
719 }
720
721 leftEnd, ok, err := c.listFindEnd(key, Left)
722 if err != nil || !ok {
723 return
724 }
725
726 switch {
727 case rightEnd.address == leftEnd.address:
728 element = rightEnd.value
729 // no action to take
730
731 case leftEnd.right == rightEnd.address:
732 actions = append(actions, leftEnd.updateBothSidesAction(rightEnd.address, listNull, c))
733 actions = append(actions, rightEnd.updateBothSidesAction(listNull, leftEnd.address, c))
734 element = rightEnd.value
735
736 case leftEnd.right == rightEnd.left:
737 middle, ok, err := c.listGetByAddress(key, leftEnd.right)
738 if err != nil {
739 return element, err
740 }
741
742 if !ok {
743 return element, errors.New("concurrent modification")
744 }
745
746 actions = append(actions, leftEnd.updateBothSidesAction(rightEnd.address, middle.address, c))
747 actions = append(actions, rightEnd.updateBothSidesAction(listNull, leftEnd.address, c))
748 actions = append(actions, middle.updateBothSidesAction(leftEnd.address, listNull, c))
749 element = rightEnd.value
750
751 default:
752 penultimateRight, ok, err := c.listGetByAddress(key, rightEnd.left)
753 if err != nil {
754 return element, err
755 }
756
757 if !ok {
758 return element, errors.New("concurrent modification")
759 }
760
761 actions = append(actions, leftEnd.updateSideAction(Left, rightEnd.address, c))
762 actions = append(actions, rightEnd.updateBothSidesAction(listNull, leftEnd.address, c))
763 actions = append(actions, penultimateRight.updateSideAction(Right, listNull, c))
764 element = rightEnd.value
765 }
766
767 if len(actions) > 0 {
768 _, err = c.ddbClient.TransactWriteItemsRequest(&dynamodb.TransactWriteItemsInput{
769 TransactItems: actions,

Callers 1

RPOPLPUSHMethod · 0.95

Calls 4

listFindEndMethod · 0.95
listGetByAddressMethod · 0.95
updateBothSidesActionMethod · 0.80
updateSideActionMethod · 0.80

Tested by

no test coverage detected